在安卓開發過程當中,當點擊HOME鍵,將app運行在後臺時,而後再點擊app圖標進入時,遇到了以下兩種狀況:app
一、每次打開時,app的入口頁面老是被執行。ide
二、當運行內存被其它應用佔用完時,在進入app時,home時的當前頁面數據沒有被清除(待進一步確認),此時頁面正常,點擊返回鍵以後顯示的頁面數據被清除了,而致使應用崩潰。指針
下面將針對這兩個問題的處理方式進行相對應的說明。code
1、若是activity的啓動方式是singleTask,則會出現此問題。若是是默認的standard方式,則沒有這樣的問題(待進一步確認)。可是不少時候都須要使用singleTask方式啓動界面,這時須要在app入口的界面的oncreate()方法中作如下處理。生命週期
if (!isTaskRoot()){
finish();
return;
}
說明:isTaskRoot():用來判斷當前Activity是否是該任務棧中的根Activity,也就是說是否是一個啓動的Activity。而且該activity是否被啓動過。
moveTaskToBack(boolean momRoot):是把當前的Activity退到後臺,不是finish,並不會走ondestory()。參數nonRoot表示的含義是此方法對非根activity是否有效,也就是說true表示對全部activity均有效,false表示只對根activity有效。
此時要注意該界面銷燬時所作的操做,要避免空指針異常。
2、這裏要講兩個方法:
一、
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
outState.putBoolean(SaveState,true);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(SaveState,true);
}
onSaveInstanceState方法有這兩個,第一個使用在非FragementActivity中,而第二個用在FragementActivity中。
該方法會在系統自動清除組件裏的數據時會被調用。
二、
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
savedInstanceState.putBoolean(SaveState,true);
}
該方法會在系統銷燬組件時會被調用。
用這兩個方法保存的變量,能夠在組件的onCreate(Bundle savedInstanceState)方法中取出。每次界面數據被清理掉以後,再顯示到前臺時,都會從新走生命週期。Fragement有本身的生命週期,也須要作處理。