序言
現(xiàn)在手機內(nèi)存都還挺大的,我們用魅族Mx4pro 3G內(nèi)存做實驗可以申請到的最大內(nèi)存空間為221M 如果設(shè)定屬性android:largeheap = "true"時燃逻, 可以申請的最大內(nèi)存空間為478M,是原來的兩倍多一些。
假如現(xiàn)在應用退到后臺了,執(zhí)行了某個清理軟件可能app會收到內(nèi)存緊張的通知再進入app可能我們activity就重啟了,里面如果有fragemnt那可能就出現(xiàn)了錯亂問題 !開始我們的表演
進入主題
Anroid基于進程中運行的組件及其狀態(tài)規(guī)定了默認的五個回收優(yōu)先級:
- Empty process(空進程)
- Background process(后臺進程)
- Service process(服務(wù)進程)
- Visible process(可見進程)
- Foreground process(前臺進程)
我們使用模擬器來模擬 , 新建模擬器配置參數(shù)
運行起來我們app -> 隨便點擊讓fragment進行替換 -> Home鍵盤回到后臺 -> 打開系統(tǒng)瀏覽器或者其他
-> studio執(zhí)行命令 am kill 包名 通知內(nèi)存緊張 -> ok 再到我們主界面看看fragment是不是亂了
解決辦法
在activity中
if (savedInstanceState != null && !savedInstanceState.isEmpty()) {
try {
List<Fragment> fragments = getSupportFragmentManager().getFragments();
for (int i = 0; i < fragments.size(); i++) {
getSupportFragmentManager()
.beginTransaction()
.remove(fragments.get(i))
.commitAllowingStateLoss();
}
} catch (Exception e) {
e.printStackTrace();
}
EventBus.getDefault().unregister(this);
ActivityManager.getInstance().finishAllActivity();
this.finish();
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
return;
}
最簡單暴力的方法,讓Activity重置颊郎!如果需要保存Fragment狀態(tài)可以使用
onSaveInstanceState // 內(nèi)存吃緊保存狀態(tài)
onRestoreInstanceState // 例如切換橫豎屏時Activity銷毀后 回復狀態(tài)方法 參數(shù)一定有數(shù)據(jù)