2013-02-07 41 views
0

我有一個長時間運行的服務,響應多個BroadcastReceivers(在代碼中創建,而不是清單)。大多數情況下,服務運行良好,但有時會停下來(BroadcastReceivers停止工作) - 我想系統會以某種方式暫停它(當我查看設備上正在運行的進程時,我可以清楚地看到服務仍然是「運行」)。onDestroy在Android服務

我不知道服務暫停的正確原因,但我想知道在這些情況下是否調用onDestroy()方法或是否有機會以某種方式處理此問題。

我認爲onDestroy()沒有被調用,因爲服務在Running processes選項卡中仍然可見。我也有該服務返回START_STICKY標誌,以便系統在出於內存原因死亡時重新啓動它。此外,如果它以某種方式「暫停」,是否有可能爲此創建WakeLock

我知道最好的解決方案是將所有BroadcastReceivers放入清單並創建一個叫做onReceive()方法的一次性服務。然而,我選擇了長時間運行服務的方式,因爲初始化階段非常緊湊,所以最好只初始化一次。

回答

0

onDestroy()將僅在服務因資源缺乏或顯式停止而被終止時調用。

當您的手機由於CPU停止而空閒(通常在屏幕關閉時)時,該服務可以「暫停」。要使服務始終運行,您應該使用PowerManager.PARTIAL_WAKE_LOCK - 但要明智地使用它,因爲它不會停止CPU並因此耗盡電池電量。你永遠不應該讓你的應用程序始終運行。只要做你需要的東西,拿着一個WakeLock然後釋放它。

http://developer.android.com/reference/android/os/PowerManager.html

http://developer.android.com/reference/android/os/PowerManager.WakeLock.html

您可以使用AlarmManager定期 「喚醒」 你的應用程序,並做一些事情。

http://developer.android.com/reference/android/app/AlarmManager.html

+0

感謝您的回答。問題在於服務大部分時間沒有做任何事情,只是對BroadcastReceivers做出響應。我寧願將WakeLocks放入onReceive()方法中。但是,由於服務暫停,onReceive方法甚至不會被觸發,因此WakeLock內部也不會被使用,對吧? – NumberFour

+0

@NumberFour從來沒有試過這個。嘗試在onReceive被觸發後立即獲取WakeLock。如果它沒有工作,嘗試註冊一個靜態接收器(在清單中)並查看它是否被喚醒。 –

+0

要試試這個,謝謝 – NumberFour

相關問題