我正在追蹤一個在極少數情況下會導致應用程序在後臺處理一段時間後通過最近的應用程序列表重新激活時發生崩潰的錯誤。發生這種情況時,調用堆棧信息指示該活動尚未正確恢復其實例狀態。用於保存/恢復狀態的必要代碼爲 - 狀態保存在onSaveInstanceState
中並在onCreate
(在此情況下不是onRestoreInstanceState
)中恢復。Android殺死進程時未調用saveInstanceState
我知道Android正在做什麼:它會在某個時候殺死應用進程以節省內存,並在重新激活應用時重新啓動它。但看起來Android在調用進程之前有時不會調用onSaveInstanceState,導致將一個null
Bundle傳遞給onCreate。這是致命的,因爲從應用程序的角度來看,它從未停止過,但現在它的狀態已經消失。
任何想法如何發生?
另一個令人費解的細節是,雖然通過任務管理器殺死應用程序的過程不能(很容易地)再現崩潰,但在設備的開發人員選項中將後臺進程的數量設置爲「無」是一貫可重複的。 (我知道整個過程實際上在兩種情況下都被殺死了,因爲當應用程序重新啓動時,我可以看到它在等待調試器附加,當過程仍然存在時不會發生)。
在不允許後臺進程的情況下,按主頁按鈕並通過最近的應用程序列表重新激活應用程序足以重現崩潰。記錄清楚地表明onSaveInstanceState
未被調用,並且null
包被傳遞給onCreate
。
根據文檔,onSaveInstanceState
總是在系統殺死進程之前調用。任何想法爲什麼它不會在這種情況下呢?