2014-04-13 14 views
5

我有一個應用程序,其中一個activity和一個service。如果我在service運行時殺死activity,它也會被殺死。服務不會被殺死對我來說非常重要。如何使當系統殺死(或者我通過清除「最近的應用程序」列表殺吧)activityservice仍然有效,直到它完成它的工作?提前致謝!如何避免應用程序/活動中斷時系統查殺服務

+0

您確定不會在onDestroy或您的活動代碼中的某處銷燬該服務嗎? –

+0

是的,我敢肯定,因爲我的'service'運行日誌中看到,當我清除「最近的應用程序」列表中的'service'馬上就會被殺死,然後重新啓動,因爲我設置了'START_STICKY'標籤。 – Salivan

+0

哦,我得到了你,你在問一個不同的事情。但是,是的,我也很確定。我不會在'activity'的代碼中手動銷燬它。但是,另一方面,我的'activity'甚至沒有一個被覆蓋的'onDestroy()'方法,所以也許它被設置爲在該方法中默認關閉所有相關的服務? – Salivan

回答

1

這對我來說是非常重要的是,服務不被殺

你的方法可以在被殺死基於任何原因,基於用戶活動(最近的任務列表,第三方任務管理器,設置中的「強制停止」等)或基於操作系統需求(系統RAM越來越低)的任何時間。你無法防止這一點。

您可以採取一些措施來儘量減少操作系統自行決定終止您的過程的機率,例如在服務上使用startForeground(),但這會阻止用戶執行用戶想要的應用程序過程。

因此,如果該服務停止,則窗口消失,我顯示來自該服務的窗口。

據推測,用戶希望你的窗口消失,如果用戶明確地得到通過最近的任務列表,任務管理器等,您肯定歡迎您的文檔中告知用戶擺脫你的應用程序這會產生任何負面影響。

也歡迎您與具有服務是在一個單獨的進程進行實驗。我的理解是,這不會對最新的Android 4.4任務列表有所幫助,儘管它可能會在早期版本的Android上。這對第三方任務管理器是否有所幫助可能取決於經理,這不應該有助於設置中的「強制停止」。這也意味着你將不得不處理IPC,增加系統RAM消耗,同時你的主要和服務進程都在運行,等等。

+0

好的,我可以在另一個流程中啓動服務嗎?當用戶殺死我的申請流程時,我的服務流程仍然保持原樣? – Salivan

+0

@Salivan:哈,我剛剛添加了一個更新 - 請參閱編輯答案。 – CommonsWare

+0

窗口有一個關閉按鈕,用戶可以通過按下它來擺脫該窗口。這也會停止服務。但是有什麼方法可以在用戶終止活動之後讓服務保持活躍狀態​​? – Salivan

2

你可以嘗試從onStartCommand在您的服務返回START_STICKY

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    handleCommand(intent); 
    // We want this service to continue running until it is explicitly 
    // stopped, so return sticky. 
    return START_STICKY; 
} 
+0

我已經這樣做了,但這根本沒有幫助,因爲我需要'服務'不會停止。我正在顯示一個來自'service'的窗口,所以如果'service'停止,窗口就會消失。重新創建窗口沒有任何意義。我需要它保持在屏幕上,即使'activity'被殺死了,所以我需要保持'service'不變,直到窗口關閉。 – Salivan

+1

你可以試試'startForeground'。 – Sipka

+0

我不認爲這可能有幫助,因爲我想避免在用戶清除「最近的應用」列表時終止'服務'。不是由系統。 – Salivan

0

你正在運行綁定服務嗎?如果是這樣,那麼當最後一個客戶端活動斷開(終止)時,系統將終止它。下面是來自reference page導語:

當最後一個客戶從服務解除綁定,系統破壞 服務(除非該服務也被startService()啓動)。

+0

不限制服務而不是系統。我希望服務在用戶清除「最近的應用」列表並終止活動後保持活動狀態。 – Salivan

相關問題