歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android應對Activity進程被殺死

Android應對Activity進程被殺死

日期:2017/3/1 9:44:08   编辑:Linux編程

常在一部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

Copyright © Linux教程網 All Rights Reserved