activity異常被殺死數(shù)據(jù)保存的處理-創(chuàng)新互聯(lián)

從界面跳轉(zhuǎn)后被系統(tǒng)Kill來(lái)看Activity的方法調(diào)用

在xx手機(jī)上速配出現(xiàn)bug修復(fù)的任務(wù),軟件在xx手機(jī)上打開,跳過(guò)一個(gè)界面,就把上一個(gè)界面給Kill了,剛開始以為是xx手機(jī)修改了android系統(tǒng),后來(lái)發(fā)現(xiàn)是手機(jī)太爛了,內(nèi)存太低了,每次跳轉(zhuǎn)都因內(nèi)存不足把上個(gè)界面給Kill了,正好讓我復(fù)習(xí)和實(shí)際運(yùn)用一下Activity中的onSaveInstanceState方法和onRestoreInstanceState方法!

從策劃到設(shè)計(jì)制作,每一步都追求做到細(xì)膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶提供成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、域名注冊(cè)、網(wǎng)頁(yè)空間、網(wǎng)絡(luò)營(yíng)銷、VI設(shè)計(jì)、 網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造優(yōu)易品牌,攜手廣大客戶,共同發(fā)展進(jìn)步。

紙上得來(lái)終覺(jué)淺,絕知此事要躬行!以前在網(wǎng)上學(xué)習(xí)了onSaveInstanceState方法和onRestoreInstanceState方法,一直都很少機(jī)會(huì)體驗(yàn)它存在的場(chǎng)景,沒(méi)有深刻的體會(huì),這次讓我再次感受到學(xué)習(xí)開發(fā)就是理論后要多實(shí)踐,不管多難都要上手去做,才能更深刻的理解那些理論原理!

1、讓程序出現(xiàn)被系統(tǒng)kill的場(chǎng)景,而且onSaveInstanceState方法和onRestoreInstanceState方法都調(diào)用!

A、運(yùn)行你的程序,當(dāng)程序打開時(shí),按HOME鍵,這時(shí)系統(tǒng)會(huì)調(diào)用onSaveInstanceState方法,注意:這個(gè)方法的調(diào)用是系統(tǒng)決定的,不是軟件或者其他什么因素,系統(tǒng)覺(jué)得有可能在某個(gè)時(shí)間因內(nèi)存不足等因素而Kill掉你,所以給你個(gè)機(jī)會(huì)讓你現(xiàn)在先利用這個(gè)方法保存下數(shù)據(jù),所以調(diào)用onSaveInstanceState方法。

activity 異常被殺死數(shù)據(jù)保存的處理

B、一般情況下,即使你在onSaveInstanceState保存了數(shù)據(jù),在系統(tǒng)沒(méi)Kill掉程序的情況下,你再回到剛關(guān)閉的界面,你也會(huì)感覺(jué)剛才調(diào)用onSaveInstanceState方法保存的數(shù)據(jù)沒(méi)什么作用,只有在系統(tǒng)kill掉程序的情況下,再回到剛關(guān)閉的界面,回調(diào)了onRestoreInstanceState方法,這時(shí)onSaveInstanceState方法保存的數(shù)據(jù),才發(fā)揮真正的作用,如何重現(xiàn)這種場(chǎng)景呢,利用DDMS替系統(tǒng)干這件壞事,kill掉你的程序:在按下HOME鍵后,系統(tǒng)已經(jīng)調(diào)用你的onSaveInstanceState方法,打開DDMS找到你的程序進(jìn)程,stop你的進(jìn)程,再打開程序!

activity 異常被殺死數(shù)據(jù)保存的處理

activity 異常被殺死數(shù)據(jù)保存的處理

注意:Activity調(diào)用OnCreate方法來(lái)初始化界面,它在onRestoreInstanceState方法之前調(diào)用!

2、如果從MainActivity中通過(guò)Intent攜帶數(shù)據(jù)打開BActivity,BActivity界面被系統(tǒng)kill后,重新創(chuàng)建BActivity后之前攜帶的數(shù)據(jù)是會(huì)還原的,但該界面被殺之前對(duì)傳過(guò)來(lái)的數(shù)據(jù)做的任何修改都作廢!

3、onSaveInstanceState方法的參數(shù)(Bundle savedInstanceState) == onRestoreInstanceState方法參數(shù)(Bundle savedInstanceState)  == onCreate方法參數(shù)(Bundle savedInstanceState) ,第一次創(chuàng)建Activity時(shí),調(diào)用onCreate方法,傳進(jìn)來(lái)的參數(shù)是為null,但如果出現(xiàn)被系統(tǒng)kill又被重建時(shí)調(diào)用onCreate的場(chǎng)景,onCreate方法的參數(shù)就是onSaveInstanceState方法和onRestoreInstanceState方法參數(shù)的值!通過(guò)在onCreate方法判斷if(savedInstanceState
== null ) 是否被重建并存有數(shù)據(jù)!

4、界面上的View也都有onSaveInstanceState方法和onRestoreInstanceState方法,系統(tǒng)也是通過(guò)調(diào)用它們來(lái)存儲(chǔ)界面和恢復(fù)界面的數(shù)據(jù),系統(tǒng)會(huì)調(diào)用Activity對(duì)應(yīng)的onSaveInstanceState方法之前調(diào)用界面View的onSaveInstanceState方法!

BActivity.java

private ArrayList<String> main = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b);
if (savedInstanceState == null) {
Log.i("kill", "onCreate savedInstanceState = null 第一次創(chuàng)建BACtivity");
main = (ArrayList<String>)(getIntent().getExtras().get("main"));
Log.i("kill", "從MainActivity傳過(guò)來(lái)的值 main = " +
""+main.toString());
//往傳過(guò)來(lái)的ArrayList<String>對(duì)象填充數(shù)據(jù)
main.add("add String");

}else{
Log.i("kill", "BACtivity被殺后的重建 onCreate savedInstanceState的值 = " +
"onSaveInstanceState savedInstanceState的值 = onRestoreInstanceState" +
"savedInstanceState 的值= "+savedInstanceState.getString("save"));
main = (ArrayList<String>)(getIntent().getExtras().get("main"));
Log.i("kill", "BACtivity被殺后的重建 獲得之前從MainActivity傳過(guò)來(lái)的值 main=" +
""+main.toString());

}

}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
Log.i("kill", "BACtivity的onRestoreInstanceState方法被調(diào)用"+main.toString());
savedInstanceState.getString("save");
}

@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
Log.i("kill", "BACtivity的onSaveInstanceState方法被調(diào)用 存在main中的數(shù)據(jù)  = "+main.toString());
outState.putString("save", "come from onSaveInstanceState");
}

CustomView.java:只是繼承了Button,重寫了Button的onSaveInstanceState方法和onRestoreInstanceState方法

@Override
public Parcelable onSaveInstanceState() {
// TODO Auto-generated method stub
Log.i("kill", "CustomView onSaveInstanceState被調(diào)用");
return super.onSaveInstanceState();
}

@Override
public void onRestoreInstanceState(Parcelable state) {
// TODO Auto-generated method stub
Log.i("kill", "CustomView onRestoreInstanceState被調(diào)用");
super.onRestoreInstanceState(state);
}

activity 異常被殺死數(shù)據(jù)保存的處理

5、從BActivity打開CActivity用StartActivityForResult方法要求CActivity finish時(shí)回傳數(shù)據(jù)回BActivity,在跳轉(zhuǎn)到CActivity后BActivity被系統(tǒng)Kill了,當(dāng)CActivity finish時(shí),系統(tǒng)重建BActivity,onActivityResult方法依然能收到上個(gè)界面回傳的數(shù)據(jù)?。ㄟ@個(gè)場(chǎng)景的出現(xiàn)就是在CActivity界面時(shí)用DDMS kill程序,重建CActivity再?gòu)腃Activity回到BActivity就可以看到BActivity被重建,依然可以獲得CActivity回傳的數(shù)據(jù))上代碼

BACtivity.java

Button bBtn = (Button)findViewById(R.id.b_btn);
bBtn.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(BActivity.this, CActivity.class);
startActivityForResult(intent, 0);
}
});

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (isKill) {
Log.i("kill", "BACtivity被kill后重新創(chuàng)建的值 =" +
""+data.getExtras().getString("c"));
}else{
Log.i("kill", "BACtivity沒(méi)被kill調(diào)用的值=" +
""+data.getExtras().getString("c"));
}
}

CActivity.java

Button cBtn = (Button)findViewById(R.id.c_btn);
cBtn.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// finish自己,并回傳數(shù)據(jù)給BActivity
Intent data = new Intent();
data.putExtra("c", "comfrom CActivity");
CActivity.this.setResult(Activity.RESULT_OK, data);
finish();
}
});

activity 異常被殺死數(shù)據(jù)保存的處理

結(jié)論:

1、從A界面-->B界面-->C界面,用A界面通過(guò)Intent傳過(guò)來(lái)的數(shù)據(jù),即使B界面到C界面后B界面被殺了,再回到B界面,B界面還是拿得到A界面?zhèn)鬟^(guò)來(lái)的數(shù)據(jù),但還是原始Intent的數(shù)據(jù),如果B界面在被殺之前對(duì)Intent數(shù)據(jù)加工,通過(guò)onSaveInstanceState存儲(chǔ),通過(guò)onRestoreInstanceState統(tǒng)一處理了,那么就要繞過(guò)之前A界面通過(guò)Intent傳過(guò)來(lái)的原始數(shù)據(jù)的干擾。

2、B界面-->C界面,B界面被kill了,C界面finish后,系統(tǒng)重建B界面,依然能拿到C界面回傳的數(shù)據(jù)。

3、注意onCreate(Bundle saveInstanceSate)方法參數(shù)Bundle saveInstanceSate的作用

4、View也有onSaveInstanceState方法和onRestoreInstanceState方法

源代碼:http://download.csdn.net/detail/ak5700/6661497

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。

網(wǎng)頁(yè)標(biāo)題:activity異常被殺死數(shù)據(jù)保存的處理-創(chuàng)新互聯(lián)
文章位置:http://www.muchs.cn/article2/djhhoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)網(wǎng)頁(yè)設(shè)計(jì)公司、品牌網(wǎng)站制作、網(wǎng)站建設(shè)品牌網(wǎng)站設(shè)計(jì)、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)