在安卓開發過程中,當點擊HOME鍵,將app運行在後臺時,然後再點擊app圖標進入時,遇到瞭如下兩種情況: 1、每次打開時,app的入口頁面總是被執行。 2、當運行記憶體被其它應用占用完時,在進入app時,home時的當前頁面數據沒有被清除(待進一步確認),此時頁面正常,點擊返回鍵之後顯示的頁面數據被 ...
在安卓開發過程中,當點擊HOME鍵,將app運行在後臺時,然後再點擊app圖標進入時,遇到瞭如下兩種情況:
1、每次打開時,app的入口頁面總是被執行。
2、當運行記憶體被其它應用占用完時,在進入app時,home時的當前頁面數據沒有被清除(待進一步確認),此時頁面正常,點擊返回鍵之後顯示的頁面數據被清除了,而導致應用崩潰。
下麵將針對這兩個問題的處理方式進行相對應的說明。
一、如果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有效。
此時要註意該界面銷毀時所做的操作,要避免空指針異常。
二、這裡要講兩個方法:
1、
@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中。
該方法會在系統自動清除組件里的數據時會被調用。
2、
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
savedInstanceState.putBoolean(SaveState,true);
}
該方法會在系統銷毀組件時會被調用。
用這兩個方法保存的變數,可以在組件的onCreate(Bundle savedInstanceState)方法中取出。每次界面數據被清理掉之後,再顯示到前臺時,都會重新走生命周期。Fragement有自己的生命周期,也需要做處理。