常在一部Android手機裡同時運行著多個應用(app),每個app對應一個系統進程,當系統需要更多的資源(如內存)而空閒資源不足時,Android系統就會選擇殺掉一些低優先級的進程以便釋放所需資源,這也是Android開發與PC桌面開發不同的之處。
Android系統進程優先級的高低通常是這樣判斷的:
1)如果一個app正在與用戶交互,那麼它所在的進程具有最高優先級;
2)如果一個app是可見的,例如被一個對話框部分遮擋,它所在進程具有第二高的優先級;
3)如果app當前是不可見的,也就是被切換到了後台,則它所在進程具有第三高的優先級;
4)如果這個後台app啟動了一個service,則它比一般的後台app優先級高一些;
5)最後,如果一個進程裡沒有包含任何app,那麼這個進程的優先級是最低;
當系統資源嚴重不足時,任何一個進程都有可能被殺掉,而當用戶想回到一個已經不存在於內存中的Activity時,系統只得新建一個這樣的Activity對象並調用它的onCreate()方法進行恢復。因此有時就會出現如下情況:大部分時間運行正常,偶爾在切換Activity時出現空指針異常導致強制關閉,這多半是在onCreate()方法裡使用了已經被重置為空的對象造成的。即使不出現異常,也會造成表單數據丟失,嚴重影響用戶體驗。
要解決這類問題:
1)不能抱現在手機內存大,進程一般不會被殺掉的僥幸心理,而應該以app隨時都會被殺掉的態度來謹慎處理。
2)在適當的位置將Activity所需數據進行持久化(從ram復制到rom或sd卡),並在onCreate()方法裡利用這些數據恢復現場,通常包括文檔類型和用戶狀態類型。
對於文檔類型:當用戶離開當前Activity時,在onPause()方法裡將當前正在編輯的文檔持久化到SQLite數據庫或者XML文件中,若當前Activity被殺死,可在onCreate()方法中恢復。
對於狀態類型:可通過SharedPreferences在onPanse()方法中將當前狀態信息保存,比如保存某個應用的視圖配置信息,若當前Activity被殺死,可在onCreate()方法中恢復,這樣就可以確保一個較好的用戶體驗。
注意事項:
1)通常在onPause()裡持久化而不是在onSaveInstanceState()裡,是因為前者比後者更可靠,因為onSaveInstanceState()不屬於Activity生命周期的一部分,在onPause()裡做持久化比較方便,缺點是調用次數稍多。
2)從Android 3.0版本開始,Activity進程在被系統殺掉之前,將保證onStop()方法先執行完成,因此如果我們開發的應用只運行在3.0以上,可以把持久化工作放在onStop()裡以減少持久化的次數。
總之一句話:在onPause()或者onStop()裡持久化Activity數據,在onCreate()裡恢復現場。
Ubuntu 14.04 x64配置Android 4.4 kitkat編譯環境的方法 http://www.linuxidc.com/Linux/2014-05/101148.htm
Ubuntu 12.04搭建Android開發環境 http://www.linuxidc.com/Linux/2012-09/69961.htm
Ubuntu 14.04 配置 Android SDK 開發環境 http://www.linuxidc.com/Linux/2014-05/101039.htm
64位Ubuntu 11.10下Android開發環境的搭建(JDK+Eclipse+ADT+Android SDK詳細) http://www.linuxidc.com/Linux/2013-06/85303.htm
Ubuntu 12.10 x64 安裝 Android SDK http://www.linuxidc.com/Linux/2013-03/82005.htm
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11