2014-05-12 60 views
0

據我所知,Android可能會在任何時候殺死我的進程1Android:狀態強制殺死的應用程序

有人可能會解釋文章[1],使得在任何時候,一個過程必須能夠在碰撞後倖存下來。這是如何處理的?如果某個過程以這種方式死亡,是否有任何方法的保證?文章*沒有提到它。

我的問題是,你如何保證在下一次啓動時以一種理智的方式恢復被迫殺死的進程?我的進程唯一的狀態(假設進程被終止時調用的方法沒有保證)是持久存儲(DB或其他地方)中的狀態,如果進程被強制終止,這可能是不完整的。

具體示例:假設我要求服務執行一些工作。這項工作不像播放音樂文件。這是可以在某些時候被認爲「完成」的工作(例如將數據發送到網絡)。如果我的服務被殺死了,在完成50%的工作之後,如果我的應用程序知道工作是否成功,該怎麼辦?我可以在持久存儲器中標記「已完成」,但即使如此,在發送最後一個字節之後,我設置標誌之前,Android可能會終止我的服務。

有沒有處理這個問題的常用方法?我的服務在重新啓動後可能會與Web服務器進行協商,以查看文件是否已傳輸,但它很快變得非常複雜,我認爲它不會真正解決問題。

[編輯1日開始]

我知道下面的文字[1],但是,「這最後的狀態是每一個用戶離開該應用程序的一部分時產生的,不爲服務解決問題,不是當它被封殺」

[編輯1點結束]

[編輯2開始]

我發現了一些很有趣的。 Android文檔中與此相關的明顯不一致。請參閱在2

[編輯2月底]

[編輯3開始]

的 「明顯不一致」 已經解決了我的新問題。這是由於我對「應用程序」/「過程」/「活動」術語不確切。不過,這個問題依然存在。

[編輯3月底]

+0

這就是爲什麼你應該注意開發你的應用程序。嘗試儘可能多地優化它,並讓它變成** light **。 –

+0

我的觀點是,如果我是正確的,那麼無論我有多開心,我的應用程序可能隨時被殺死。即使在前臺。我認爲我不正確,Android有一些保證,但我找不到任何。 – eversceptic

+1

好吧,'允許內核立即回收應用程序資源,可以避免嚴重的內存不足情況。「 - 因此,不要讓Android認爲您的應用程序耗費內存,您將有更多的機會獲得其他應用程序已關閉。 –

回答

3

如果一個進程被殺死這種方式是否有被調用的任何方法任何保證?

當您的進程終止時,應用程序不會調用任何內容。

你如何保證在下一次啓動時以一種理智的方式恢復被迫殺死的進程?

這不能在摘要中回答。

我進程的唯一狀態是持久性存儲的狀態(DB或其他地方)(假定沒有保證能夠在被調用方法時,進程被殺死製造),這很可能是不完整的,如果過程是力-killed。

當數據發生變化時,您應該更新本地持久性存儲。因此,當您的流程終止時,您的持久性存儲可能是最新的。應該將內存中緩存視爲讀取緩存,而不是寫入緩存。

這是在某些時候可以認爲「完成」的工作(例如將數據發送到網絡)。如果我的服務被殺死了,在完成50%的工作之後,如果我的應用程序知道工作是否成功,該怎麼辦?

它必須與Web服務器進行協商,以確定什麼是上傳和未成功上傳。

有沒有什麼常見的方法來處理這個問題?

有多種方法可以保持「事務完整性」,特別是對於進程終止帶來更大問題的長時間運行的操作。這些都不是Android所獨有的,因爲這在數十年來一直是計算機的問題。大多數歸結爲「檢查成功,並重新嘗試沒有成功」。這很複雜取決於您試圖更新的數據的性質以及更新它的可用方法。

+0

謝謝。我很困惑,沒有更多的資源。 在Linux PC上,除非關閉電源,否則不會期望程序被殺死。在Android上,它是系統設計的一部分。這就是爲什麼我認爲了解它更重要。 基於這篇文章*,我實際上讀到,在極少數情況下,Android可能會殺死任何進程,甚至是前臺進程! * http://developer.android.com/guide/components/processes-and-threads.html – eversceptic

+0

我已經編輯了這個問題,直接指向這個新的問題,因爲我認爲一個是關於應用程序的狀態和另一個是關於系統設計的。請參閱http://stackoverflow.com/questions/23801934/android-inconsistency-in-documentation-when-may-an-app-be-killed – eversceptic