很多人都曾被這個(gè)問(wèn)題所困擾,如果app長(zhǎng)時(shí)間在后臺(tái)運(yùn)行,再次進(jìn)入app的時(shí)候可能會(huì)出現(xiàn)crash,而且fragment會(huì)有重疊現(xiàn)象。如果系統(tǒng)內(nèi)存不足、切換橫豎屏、app長(zhǎng)時(shí)間在后臺(tái)運(yùn)行,Activity都可能會(huì)被系統(tǒng)回收然后重建,但Fragment并不會(huì)隨著Activity的回收而被回收,創(chuàng)建的所有Fragment會(huì)被保存到Bundle里面,從而導(dǎo)致Fragment丟失對(duì)應(yīng)的Activity。
1.在前面提到的幾種情況下系統(tǒng)回收了Activity
2.通過(guò)onSaveInstanceState保存Fragment的狀態(tài)
3.用戶再次點(diǎn)擊進(jìn)入app
4.由于Activity被回收,系統(tǒng)會(huì)重啟Activity,根據(jù)之前保存的Fragment的狀態(tài)恢復(fù)fragment
5.Activity的代碼邏輯中,會(huì)再次創(chuàng)建新的Fragment
6.頁(yè)面出現(xiàn)混亂,覆蓋了兩層的fragment。假如恢復(fù)的Fragment使用到了getActivity()方法,會(huì)報(bào)空指針異常
對(duì)于上面的問(wèn)題,可以考慮下面這兩種解決辦法:
1、不保存fragment的狀態(tài):在MyActivity中重寫onSaveInstanceState方法,將super.onSaveInstanceState(outState);注釋掉,讓其不再保存Fragment的狀態(tài),達(dá)到fragment隨MyActivity一起銷毀的目的。
2、重建時(shí)清除已經(jīng)保存的fragment的狀態(tài):在恢復(fù)Fragment之前把Bundle里面的fragment狀態(tài)數(shù)據(jù)給清除。方法如下:
if(savedInstanceState!= null)
{
String FRAGMENTS_TAG = "android:support:fragments";
savedInstanceState.remove(FRAGMENTS_TAG);
}