2010-11-03 66 views
17

將服務放入單獨的流程或將其保留在應用程序的主流程中的實際區別是什麼?每個場景將用於什麼?Android服務:流程與非服務

+1

類似於[Android - 如何決定是否在單獨的進程中運行服務?](http://stackoverflow.com/questions/4658511/android-how-to-decide-whether-to-run-a -service-in-a-separate-process) – 2012-08-14 05:49:05

回答

10

當一個服務在主進程中運行時,它會停止,以防你的應用程序因爲任何原因崩潰。將服務放入其自己的過程對於某些服務來說是合理的,這些服務可以從不同的應用程序或服務中使用,這些服務應該獨立於主應用程序運行。

1

以下爲Android Developer's web site的報價。

請注意,與其他應用程序對象一樣,服務在其宿主進程的主線程中運行。這意味着,如果你的服務要做任何CPU密集型(如MP3播放)或阻塞(如網絡)操作,它應該產生自己的線程來完成這項工作。

傑克指出,你可以直通清單,控制名稱正在運行的進程。但是從Documentatioin以下結果:

有關服務類最混亂實際上都是圍繞着它不是什麼:

  • 服務沒有單獨的進程。服務對象本身並不意味着它在自己的進程中運行;除非另有說明,否則它與其所屬應用程序的運行過程相同。

這很有趣,說什麼Here是:

的過程,其中服務是運行的名稱。通常,應用程序的所有組件都在爲應用程序創建的默認進程中運行。它與應用程序包具有相同的名稱。元素的流程屬性可以爲所有組件設置不同的默認值。但是組件可以用自己的進程屬性覆蓋缺省值,從而允許將應用程序分佈在多個進程中。

但無論如何,如果您需要將服務暴露給其他應用程序,例如,您需要向其他應用程序提供內容(如電話簿),將服務設置爲在不同進程中運行是原因。

+3

其實你對流程有非常明確的控制。請參閱http://developer.android.com/guide/topics/manifest/service-element.html [android:過程標籤] – Jake 2010-11-03 02:38:41

+0

哦。我從來沒有注意到這樣的事情。 – xandy 2010-11-03 02:41:23

-1

使用服務的進程屬性被清單解析器拒絕,所以它相當具有誤導性!

+1

Eureka ...此鏈接http://www.androidsoftwaredeveloper.com/2009/03/20/how-to-start-on-boot/顯示進程名稱必須以android.process開頭,例如android:process =「android.process.myservice」 – warrell 2010-12-02 10:26:37

+2

任何與它通信的廣播接收器都必須在該過程中,所以它應該具有相同的名稱,例如android:process =「android.process.myservice」 – warrell 2010-12-02 10:28:00

+0

這大大加快了我的應用程序! – warrell 2010-12-02 10:28:47

7

我看到把一個服務在另一個進程的唯一原因是

  1. 該應用程序是資源重,有可能會被操作系統迅速殺死。把服務放在一個單獨的過程中將分配資源,如果你的應用程序死了你的服務不會。
  2. 只是爲了防止您的應用程序出現錯誤並死亡,您的服務將繼續進行。

但是,如果您創建一個良好的應用程序並使用良好的編程,則不應該遇到這些問題之一。通過讓你的服務在一個單獨的進程中引起麻煩,像SharedPreferences和併發數據庫訪問......我建議不要這樣做。

更不用說......另一個過程意味着另一個DVM。這需要比在一臺DVM上運行更多的資源,並且會減慢速度。

2

同時將服務放在另一個進程中會使您對主進程隱藏靜態變量的更改。你可以得到的情況,當你分配一個變量有一些價值,並沒有改變!我花了一整天的時間來解決這個問題

+0

true ..你可以解釋爲什麼這種行爲 – 2015-05-18 06:03:18

+1

**不**使用靜態變量的一個很好的理由:-) – William 2016-05-02 04:55:15

+0

@William你建議使用什麼?把我的變量放在APPLICATION類中? – mhdjazmati 2017-03-08 13:11:42