Android點選Home鍵後fragment重新載入問題
應用在點選Home鍵時,會呼叫onSaveInstanceState方法,隨後是OnStop方法,如果需要快取數值,就儲存在onSaveInstanceState方法中,如果是長期儲存的數值,就需要儲存在OnStop方法中。當需要獲取數值的時候,可以在OnResume方法中獲取,或者在onCreate中獲取。有人會問,這兩者有什麼區別呢?首先,在應用關閉後再次開啟時(短時間內),oncreate是不會被呼叫的,做開發的都知道,oncreate只在第一次載入的時候呼叫,所以一般在點選Home鍵切換到後臺時,呼叫順序是onSaveInstanceState、onPause、onStop,再次開啟時:onRestart、
我們在說會我們的問題,在點選Home鍵之後長時間不開啟應用,或者應用被其他多個應用推到底棧,Activity所佔用的記憶體就會被回收,當再次開啟載入,就會載入Oncreate方法,系統會將儲存在onSaveInstanceState方法中的fragment物件釋放,這時候再次去載入fragment物件,就會導致重複載入而崩潰;說完了問題,我們來聊聊解決辦法:
解決辦法:
方法1:在fragmentActivity裡oncreate方法判斷savedInstanceState==null才生成新Fragment,否則不做處理。
(此方法驗證失敗,由於onSaveInstanceState儲存的fragment物件,所以在不為空時,當前的Activity會顯示首個fragment,介面上控制元件沒有例項化,所以全部點選失效,導致程式崩潰)
方法2:在fragmentActivity裡重寫onSaveInstanceState方法,但不做實現,也就是將super.onSaveInstanceState(outState)註釋掉。(方法驗證失敗,註釋掉super.onSaveInstanceState(outState)程式碼,即在onSaveInstanceState方法中對fragment物件不做儲存,重新載入Activity就不會導致fragment重新載入,但是依然會報錯,原因不明,估計是fragment的物件無效)
@Override
protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
}
推薦:第三種,我們接著方法二來延續,取消onSaveInstanceState中的fragment物件管理的儲存,並且在重新載入Oncreate方法時做出判斷,如果為空,說明是剛剛開啟應用,正常載入fragment,如果不為空,說明Activity曾經被回收,這時候的fragment需要重新載入,具體程式碼如下:
if (savedInstanceState != null) {
manager = getSupportFragmentManager();//重新建立Manager,防止此物件為空
manager.popBackStackImmediate(null, 1);//彈出所有fragment
}
再加上方法二中的程式碼
@Override
protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
}
manager不重複衝突,至此問題終於解決,也就是在使用者Home點選切換到後臺,長期不使用的情況下,再次開啟重新載入應用