2015-02-24 37 views
3

有關Android中的進程的三個問題。我正在開發一個應用程序。如果我宣佈一個服務到另一個進程在AndroidManifest.xmlAndroid中的進程和單例

<service android:name=".MyService" android:process=":MyProcess"/> 
  1. 運行這是否意味着會有兩個JVM實例,使用的MyService之一,而使用其他代碼另一個?

  2. 如果上面的問題的答案是YES,那麼它是否也意味着如果我有一個單一類使用活動& MyService,那麼會爲單例創建兩個實例嗎?

  3. 如何確保只有一個實例被創建&然後由兩個進程共享?更好地提供樣本:)

==== ==== UPDATE

感謝您的意見和答案(S),不幸的是,我的項目需要使用單獨的服務過程它有長時間運行的後臺任務。根據你的回覆,我有第4個問題:

如果我需要通過一個不可分的對象跨MyService進程和其他代碼的過程。可能嗎?如何?

+0

1.有在Android ... 2.這就是爲什麼在單身存儲數據是在Android上沒有不好的JVM ... 3.不要單用.. 。使用android框架支持的常規IPC方法(小包裹(在Bundles,Intents中),ContentProviders,Binders) – Selvin 2015-02-24 10:18:04

+0

我不知道所有三個co ncern,但我發現有關過程的好信息在這裏,這個鏈接可能會幫助你。 http://stackoverflow.com/questions/7142921/usage-of-androidprocess。 – IshRoid 2015-02-24 10:27:35

+0

@ Leem.fin你需要使不可分類的對象可以被分類: - )參見例子[this](http://stackoverflow.com/questions/7181526/how-can-i-make-my-custom -objects-be-parcelable)回答 – Joris 2016-03-01 12:48:56

回答

4
  1. 是的(以某種方式,但不完全,它是一個dalvik虛擬機,或在棒棒糖藝術),但是,你有兩個單獨的東西運行服務和代碼的其餘部分。
  2. 你不能!你剛剛告訴系統有單獨的進程。所以它不能擁有「同一個」單身人士。

一種方法是讓你的服務實現一個活頁夾或AIDL(以防你直接調用方法)或者實現一個ContentProvider,它在你可以從中讀取值的過程中是相同的。

或者你可以簡單一點,不要使用這個過程。不建議99.9%的使用案例android:process。所以重新評估你的軟件。你真的需要它嗎?

編輯:

不幸的是,我的項目需要使用單獨的服務過程,因爲它 一直在後臺運行的

如果你的項目需要一個長期運行的後臺任務,你需要肯定是Service。但這並不意味着它需要在一個單獨的過程中。您項目中的所有活動都可以進入後臺並進行垃圾收集,您的服務仍能正常運行。它將繼續運行在與活動運行相同的過程中,但服務和單身人員仍然活着。只記得從它return START_STICKY

如果你仍然認爲你需要在一個單獨的過程中使用它(我認爲你不需要)。然後你需要實現一個綁定的服務(或者可能是AIDL,我不確定綁定的服務會在整個過程中工作),將活動連接到它並且使用常規方法給出對象的引用,如public void takeThisObJect(Object reference);

鏈接約束和AIDL服務指南:

http://developer.android.com/guide/components/bound-services.html http://developer.android.com/guide/components/aidl.html

+0

感謝您的回覆,請檢查我的更新:) – 2015-02-24 10:49:39

+0

請參閱我的編輯。並記住AIDL非常複雜。並且Bound是一個稍微複雜一點。你當然想要保持在同一個過程中。 – Budius 2015-02-24 10:57:23

+0

謝謝,但正如我所知,AIDL只接受可傳遞的可傳遞對象。我在「UPDATE」部分中的問題實際上是詢問如何使用AIDL傳遞不可Parcel對象。 – 2015-02-25 14:22:38