2011-12-03 32 views
2

我有一個服務在自己的進程中運行。在晚上似乎很好,但在我入睡之後,我認爲Android會勇於嘗試。有沒有跡象表明Android殺死一個服務?

我是否認爲onDestroy()在Android殺死服務時不會被調用?如果沒有,是否還有其他地方殺人登記?

我想我需要研究AlarmManager

回答

3

我有一個服務在自己的進程中運行。

爲什麼在它自己的過程中?

我是否認爲Android殺死服務時不會調用onDestroy()?

它可能,它可能不。

如果不是,是否還有其他地方殺人登記?

我想我會需要研究的AlarmManager。

用戶討厭永遠活着的服務,這就是爲什麼任務殺手很受歡迎。他們討厭在自己的流程中運行的服務,因爲它們消耗更多的RAM,CPU和電池,通常沒有任何理由。

如果您的目標是定期做一些事情,使用AlarmManager - 這就是爲什麼它在那裏。

+0

這是在它自己的過程中,因爲我希望它可以選擇在啓動時啓動,除配置外沒有UI。 它不會永遠活着,只是在配置中指定的時間長度。 無論如何,在閱讀Android的服務方法後,我可以看到使用AlarmManager在適當的時候啓動我的服務是一個比讓它潛伏在等待中更好的方法。 – TomDestry

+0

@TomDestry:「它在自己的過程中,因爲我希望它可以選擇在啓動時啓動,除配置外沒有用戶界面」 - 這不需要單獨的過程。 – CommonsWare

1

根據開發人員文檔中的Service lifecycle,當服務被終止或停止時,將調用onDestroy()方法。另外,如果一個應用程序有一個在後臺運行的服務(即音樂播放器在後臺播放),系統會認爲該應用程序處於活動狀態,除非是極端條件,否則不會終止其進程(我不認爲這在實踐中發生)。

文件稱:

Note this means that most of the time your service is running, it may be killed by the system if it is under heavy memory pressure. If this happens, the system will later try to restart the service. An important consequence of this is that if you implement onStartCommand() to schedule work to be done asynchronously or in another thread, then you may want to use START_FLAG_REDELIVERY to have the system re-deliver an Intent for you so that it does not get lost if your service is killed while processing it. 

在這裏,我所想的是,如果服務是由OS死亡,操作系統將稍後嘗試重新啓動它。但是,在這種情況下,是否調用了onDestroy()方法?我不確定。有人測試過嗎?

+2

'onDestroy()'不保證被調用。 – CommonsWare

+0

真的嗎?我知道Activity,'onDestroy()'不保證被調用。服務是否一樣?該文件指出:「如果服務當前正在其onCreate(),onStartCommand()或onDestroy()方法中執行代碼,則主機進程將成爲前臺進程,以確保此代碼可以執行而不會被終止。」但是,我從來沒有測試過這個。 – Huang

+0

如果Android對RAM有緊急需求,它可以隨時終止進程。當它這樣做時,它不會在該進程中的任何正在運行的組件上調用'onDestroy()'。 – CommonsWare

相關問題