解決Android開發(fā)中遇到的一些小問題
一、我們在開發(fā)的過程中喜歡將一些app常用的數(shù)據(jù)對象保存在Application中,使用起來很方便。但是有的時(shí)候APP崩潰了,原因是空指針,而導(dǎo)致空指針的原因正式正式這些數(shù)據(jù)。
用戶按home鍵退出app。長時(shí)間的其他操作過后,系統(tǒng)為了回收內(nèi)存kill掉了這個(gè)app。接下來就是crash的部分了,用戶重新打開這個(gè)App。Android系統(tǒng)創(chuàng)建一個(gè)新的MyApplication 實(shí)例并恢復(fù) 當(dāng)前Activity。當(dāng)前Activity從新的MyApplication去獲取對象,由于這個(gè)MyApplication是系統(tǒng)新創(chuàng)建的對象,之前保存的數(shù)據(jù)全為空了,這是因?yàn)閍pplication 對象不會一直呆著內(nèi)存里面,它會被kill掉。與大家普遍的看法不同之處在于,實(shí)際上app不會重新開始啟動(dòng)。
Android系統(tǒng)會創(chuàng)建一個(gè)新的 Application 對象,然后啟動(dòng)上次用戶離開時(shí)的activity以造成這個(gè)app從來沒有被kill掉得假象。因此在Application中存放對象會產(chǎn)生很嚴(yán)重的后果,推薦使用SP。
二、解決有的手機(jī)APP退至后臺后點(diǎn)擊應(yīng)用圖標(biāo),應(yīng)用重新啟動(dòng)的問題。
在你應(yīng)用的第一個(gè)頁面的setContentView(...)之前添加如下代碼:
if (!this.isTaskRoot()) {
Intent intent = getIntent();
if (intent != null) {
String action = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(action)) {
finish();
return;
}
}
}
在清單文件中將該頁面的啟動(dòng)模式的代碼刪除
三、APP主頁面使用fragmentManager.beginTransaction()添加fragment時(shí),當(dāng)退出應(yīng)用長時(shí)間不操作,返回應(yīng)用時(shí),fragment發(fā)生重疊。
原因:因?yàn)槊慨?dāng)我們離開Activity的時(shí)候,切換到后臺的時(shí)候,當(dāng)內(nèi)存不夠用,F(xiàn)ragment所在Activity被銷毀,會調(diào)用onSaveInstanceState()方法,F(xiàn)ragment都會被保存起來,當(dāng)我再次回到這個(gè)app的時(shí)候,通過onCreate中的參數(shù)savedInstanceState恢復(fù)了之前的fragment,但是只是保存了數(shù)據(jù),F(xiàn)ragment的show狀態(tài)并沒有被保存起來,就導(dǎo)致了界面重疊。
解決方法
重寫onSaveInstanceState(...)空實(shí)現(xiàn),即不允許activity保存我銷毀之前的狀態(tài)
@Override
public void onSaveInstanceState(Bundle outState) {
//super.onSaveInstanceState(outState, outPersistentState);
}