2012-02-26 97 views
2

我有一個Android應用程序(活動),它也具有相應的服務。該服務由活動啓動,即使活動停止,也應該連續運行。當活動再次啓動時,它可以綁定到服務並進行查詢。由於堆碎片導致服務崩潰的Android活動

有時活動會被操作系統破壞和創建。這不應該影響事物,應該重新創建活動並且能夠再次綁定到服務。這基本上工作。

但是......

我發現,無論是Dalvik虛擬機堆和本地堆是不可壓制成型和規模因此不斷增加,直到活動運行的內存和崩潰(即使總內存用量實際上是不變的,不會泄漏)。由於在創建過程中進行了大量分配,因此通過銷燬和重新創建活動而加劇了這種情況。

這幾乎可以保證活動在多次重新啓動後都會崩潰。這並不會影響我,但是接下來發生的事情是該服務也會崩潰,因爲它是同一應用程序的一部分。該服務包含一些重要數據,然後在崩潰期間丟失。

我對如何解決這個問題有什麼建議感興趣?

有沒有辦法將服務與活動分開(這樣當活動崩潰時它不會使服務崩潰),但仍然在同一應用程序中具有服務和活動?

我可以堅持服務數據,但這需要對數據庫進行多次訪問,並且不利於節省電池。

回答

0

這聽起來像你的服務是保持參考你已停用的活動。您應該使用已啓動的服務,而不是綁定的服務。請參閱Services指南主題了解有關差異以及如何使用每個差異的詳細信息。

如果您想使用綁定服務(即出於某種原因您確實需要使用bindService()),那麼請確保在您的活動死亡之前撥打unbindService()。請注意,當最後一個活動解除綁定時,服務將暫停。

+0

我需要的服務,既啓動並裝訂成冊,我的確叫unbindService()。我認爲問題在於,因爲服務仍在運行(這是打算的),那麼當前堆仍保持活動狀態。當活動重新啓動時,它將使用與服務相同的堆,現在該服務嚴重分散。 – chris 2012-02-26 23:40:02

+1

@chris - 您可以通過在您的服務中指定['android:process'](http://developer.android.com/guide/topics/manifest/service-element.html#proc)值來測試您的假設表現。這將使服務與應用程序的活動分開進行。 – 2012-02-26 23:46:08

0

您應該在清單中指定服務「進程名稱」,您可以使用':'或小寫字符開始名稱。引用:http://developer.android.com/guide/topics/manifest/service-element.html

如果分配給該屬性的名稱以冒號(「:」),一個 新工藝,專用的應用程序,當它需要 創建和服務在該進程中運行。如果進程名稱以 以小寫字符開頭,則該服務將在名稱爲 的全局進程中運行,前提是該進程有權這樣做。

一個例子是在清單

<service android:name=".services.OfficeService" 
      android:process=":myProcess" />