1. App在什么狀態(tài)下被回收
Android系統(tǒng)在運(yùn)行程序的過程中發(fā)現(xiàn)內(nèi)存不足,他會(huì)去殺一些后臺(tái)進(jìn)程,來獲取內(nèi)存,這個(gè)過程我們簡(jiǎn)單稱為回收進(jìn)程。如果后臺(tái)進(jìn)程都?xì)⒐饬?,?nèi)存還不夠,此時(shí)可能有2種表現(xiàn),1,跳出OOM崩潰 2,殺死前臺(tái)進(jìn)程。并沒有回收某個(gè)activity或者回收某些activity的行為。
2. Android的幾種進(jìn)程
-
前臺(tái)進(jìn)程
即與用戶正在交互onResume的Activity或者Activity用到的Service在前臺(tái)等,如果系統(tǒng)內(nèi)存不足時(shí)前臺(tái)進(jìn)程是最后被殺死的
-
可見進(jìn)程
可以是處于暫停狀態(tài)(onPause)的Activity或者綁定在其上的Service,即被用戶可見,但由于失去了焦點(diǎn)而不能與用戶交互
-
服務(wù)進(jìn)程
其中運(yùn)行著使用startService方法啟動(dòng)的Service,雖然不被用戶可見,但是卻是用戶關(guān)心的,例如用戶正在非音樂界面聽的音樂或者正在非下載頁面自己下載的文件等;當(dāng)系統(tǒng)要空間運(yùn)行前兩者進(jìn)程時(shí)才會(huì)被終止
-
后臺(tái)進(jìn)程
其中運(yùn)行著執(zhí)行onStop方法而停止的程序,但是卻不是用戶當(dāng)前關(guān)心的,例如后臺(tái)掛著的QQ,這樣的進(jìn)程系統(tǒng)一旦沒了有內(nèi)存就首先被殺死
-
空進(jìn)程
不包含任何應(yīng)用程序的程序組件的進(jìn)程,這樣的進(jìn)程系統(tǒng)是一般不會(huì)讓他存在的
優(yōu)先級(jí)從下往下,依次遞減
3.避免后臺(tái)進(jìn)程被系統(tǒng)回收方法
調(diào)用startForegound,讓你的Service所在的線程成為前臺(tái)進(jìn)程
Service的onStartCommond返回START_STICKY或START_REDELIVER_INTENT
Service的onDestroy里面重新啟動(dòng)自己
4.后臺(tái)進(jìn)程被回收,進(jìn)程重啟下,Activity的恢復(fù)規(guī)則
進(jìn)程被自然回收之后,Activity的棧信息,歷史記錄還存在。再?gòu)臍v史程序里點(diǎn)擊的時(shí)候,進(jìn)程會(huì)重啟,然后只恢復(fù)棧頂?shù)腶ctivity,其他棧內(nèi)的activity只有在需要的時(shí)候被恢復(fù)。
5.其他形式的進(jìn)程死亡再恢復(fù)
崩潰(比如空指針),ddms殺進(jìn)程.
這2種方式殺進(jìn)程之后的恢復(fù)和回收進(jìn)程的不太一樣。因?yàn)檫@2種方式導(dǎo)致進(jìn)程死亡,此時(shí)進(jìn)程一般是前臺(tái)進(jìn)程,前臺(tái)進(jìn)程死亡,然后恢復(fù)并不會(huì)恢復(fù)棧頂activity,而是恢復(fù)棧頂前面的那個(gè)activity,為什么呢?
我們來解釋下,如果是崩潰導(dǎo)致進(jìn)程死亡,那崩潰發(fā)生在棧頂?shù)哪莻€(gè)activity,此activity根本沒調(diào)用 onSaveInstanceState,那怎么恢復(fù)?沒法恢復(fù),只能恢復(fù)上一個(gè)activity。
6.進(jìn)程恢復(fù)Activity規(guī)則
前臺(tái)進(jìn)程死亡后恢復(fù),恢復(fù)的是當(dāng)前顯示的activity的上一個(gè)activity,記住activity要想被恢復(fù),必須是經(jīng)歷過onSaveInstanceState的activity。
后臺(tái)進(jìn)程死亡恢復(fù),此前棧頂?shù)腁ctivity已經(jīng)調(diào)用onSaveInstanceState,因此恢復(fù)棧頂Activity.其他棧內(nèi)的Activity只有在需要的時(shí)候被恢復(fù)。
7.進(jìn)程重啟處理
所有的靜態(tài)變量被清空
如何判斷應(yīng)用進(jìn)程被系統(tǒng)回收
在Application中定義一個(gè)static常量,賦值為-1,在歡迎界面改為0,如果被強(qiáng)殺,application重新初始化,在父類Activity判斷該常量的值。
- 應(yīng)用進(jìn)程被系統(tǒng)回收如何解決
如果在每一個(gè)Activity的onCreate里判斷是否被強(qiáng)殺,冗余了,封裝到Activity的父類中,如果被強(qiáng)殺,跳轉(zhuǎn)回主界面,如果沒有被強(qiáng)殺,執(zhí)行Activity的初始化操作,給主界面?zhèn)鬟fintent參數(shù),主界面會(huì)調(diào)用onNewIntent方法,在onNewIntent跳轉(zhuǎn)到歡迎頁面,重新來一遍流程。
8.進(jìn)程被強(qiáng)殺,是指System.exit(0),或者非系統(tǒng)回收而強(qiáng)制停止進(jìn)程
- Activity不會(huì)調(diào)用任何生命周期方法。