原來(lái)Activity切換到后臺(tái)之后,由于內(nèi)存不夠训桶,此Activity被系統(tǒng)回收了累驮,一段時(shí)間之后回到該應(yīng)用程序酣倾,Activity被重新實(shí)例化了。而Activity被系統(tǒng)銷毀時(shí)谤专,附屬在該Activity的Fragment并沒有被銷毀灶挟,在Activity的onSaveInstanceState里面將Fragment狀態(tài)保存起來(lái)了,所以Activity重新創(chuàng)建了毒租,但是FragmentA和FragmentB還是之前的稚铣,而此時(shí)FragmentA和FragmentB所附屬的Activity已經(jīng)被系統(tǒng)回收了,這次再調(diào)用getActivity時(shí)返回了null墅垮,才導(dǎo)致上面問題的出現(xiàn)惕医。
我們看看FragmentActivity源碼中的onSaveInstanceState方法:
1 protected void onSaveInstanceState(Bundle outState)
2 {
3 super.onSaveInstanceState(outState);
4 Parcelable p = mFragments.saveAllState();
5 if (p != null) {
6 outState.putParcelable(“android:support:fragments”, p);
7 }
8 }
由上面源碼可以看出,F(xiàn)ragmentActivity確實(shí)在onSaveInstanceState方法里面將Fragment的狀態(tài)保存了算色。
問題解決:
知道問題的原因了抬伺,就好辦了。解決方法其實(shí)很簡(jiǎn)單灾梦,我們只要讓FragmentActivity被系統(tǒng)回收的時(shí)候峡钓,不保存Fragment的狀態(tài)即可,即在FragmentActivity中重寫onSaveInstanceState方法若河,并且注釋掉super.onSaveInstanceState(outState)就行了能岩。
1 @Override
2 protected void onSaveInstanceState(Bundle outState) {
3 // super.onSaveInstanceState(outState);
4 }
總結(jié):
1、程序出現(xiàn)問題時(shí)萧福,要先找出出現(xiàn)此問題的原因拉鹃,對(duì)癥下藥才能從根本上解決問題。
2鲫忍、對(duì)于Activity被系統(tǒng)回收導(dǎo)致的問題膏燕,可以使用切換橫豎屏來(lái)模擬場(chǎng)景。