2012-05-11 59 views
3

發生了什麼事:從Android應用程序恢復被殺害

  1. 我打開我的應用程序,然後按home鍵離開了一會兒。
  2. 我進入Settings > Applications > Manage Applications > Running,在緩存後臺應用程序列表中找到我的應用程序,並停止它。
  3. 然後我按住主頁按鈕,並在最近的應用程序列表中選擇我的應用程序,再次運行它。

[注:這些步驟只是我迫使測試人員看到了同樣的症狀的方法 - 他們只是進入和退出應用,通常情況下,不強制其關閉]

它在我離開它的活動中打開,但處於不良狀態。第一個問題是保存用戶信息的內存消失了(如果應用程序被終止,這是有意義的)。我解決了這個問題,使用戶類可序列化並將當前用戶對象存儲在onSaveInstanceState中,然後將其加載回onCreate。同樣,我不得不重新創建我的ClientConnectionManager以使網絡再次運行。

的「重裝」活動運行得很好,我可以瀏覽並使用新建活動,但如果我不是打後退按鈕回到之前我強行停止的應用程序,創建一個活動,我得到一個異常,說User類不存在(ClassNotFoundException,顯然是在執行unparcel時)。

這是怎麼發生的?當應用程序被殺時,處理這種情況的正確方法是什麼,但仍然知道重新打開時要返回哪個活動?該應用未運行但未完全關閉的狀態名稱是什麼?

回答

5
  1. 可以指定將出現在「最近使用的應用」的活動,並確保只包括主Activity或任何其他「安全」 Activityandroid:excludeFromRecents
  2. 可以識別「從歷史中推出的」情況通過在發射Intent
+0

我可以嘗試玩這些遊戲,但重要的是我可以返回我的活動。現在我的活動再次啓動,只是在後臺堆棧中的活動在啓動時崩潰。 –

+0

你能描述你的活動和以前的活動之間的關係嗎?你傳遞的是價值還是結果? – avimak

+0

我的任何活動都發生這種情況,因爲在保存狀態時,我始終將一個可序列化(並且不可分類)的用戶對象放入該包中。我已經添加了一個解決方案來討論這個謝謝你的幫助。 –

5

當一個應用程序被終止(無論是由OS或強制用戶),整個活動堆棧被清除尋找FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY。所以在後端堆棧中沒有任何活動,並且當您重新啓動它時,前臺中的活動是後端堆棧中的唯一活動。所以你不能從棧頂開始。它也可以發生在Tasks and Back Stack

提到如果用戶離開任務時間長,系統將清除除了根活動的所有活動的任務返回堆疊被清除,只留下根系活力。當用戶再次返回任務時,只有根活動恢復。系統的行爲方式是這樣的,因爲在很長一段時間之後,用戶可能已經放棄了之前正在做的事情,並且正在返回到開始新事物的任務。

+0

這似乎不是我的情況。堆棧仍然存在 - 當我點擊'後退'時,堆棧中的前一個活動啓動(並按照描述崩潰)。我認爲這篇文檔引用適用於我的情況:「當系統停止其中一項活動時(),如果系統需要恢復系統內存,系統可能會完全摧毀該活動。發生這種情況時,有關活動狀態的信息是如果發生這種情況,系統仍然知道活動在後退堆棧中有一個位置,但是當活動進入堆棧頂部時,系統必須重新創建它「 –

1

解決方案是讓我的用戶類實現Parcelable。由於我不明白的原因,我可以在保存實例狀態時將我的用戶放在Bundle中作爲Serializable對象,並且在最後一次可見活動恢復時成功取出它,但是當後棧中的活動重新啓動時不成功能夠處理該捆綁中的該對象。

現在我的應用程序從背景中被殺死後恢復。我喜歡@avimak和@Rajesh,因爲這兩個答案都教給了我很多。謝謝。

相關問題