您好,登錄后才能下訂單哦!
一.Activity進(jìn)行橫豎屏切換時(shí)候的生命周期
1.運(yùn)行的時(shí)候
2.切橫屏(生命周期執(zhí)行一次)
3.再切豎屏(生命周期執(zhí)行兩次)
重寫返回按鈕事件public void onBackPressed()此方法當(dāng)返回按鈕事件出發(fā)時(shí),體系會(huì)默許調(diào)用finish(),你直接return別讓體系調(diào)用就行,back鍵后臺(tái)參考源碼home的事件并重寫
@Override
public void onBackPressed() {
// 這里處理邏輯代碼,該方法僅適用于2.0或更新版的sdk
return;
}
android的手機(jī)的back鍵默認(rèn)行為是finish(實(shí)質(zhì)就是從Task中將其出棧)處于前臺(tái)的Activity的即Activity的狀態(tài)為Destroy狀態(tài),再次啟動(dòng)該Activity是從onCreate開始的。 而Home鍵默認(rèn)是stop前臺(tái)的Activity即狀態(tài)為onStop而不是Destroy,若再次啟動(dòng)它,則是從OnResume開始的,即會(huì)保持上次Activityd的狀態(tài)。 back鍵也有例外的,按back鍵不會(huì)關(guān)閉Activity的,比如播放音樂,按了back鍵之后仍可以繼續(xù)播放音
按下Back返回鍵
按下Home鍵
按下Home鍵后再次運(yùn)行改程序
如果將activity的android:configChanges=”orientation|keyboardHidden”屬性設(shè)置后
1, 同上1
2,
3,
總結(jié):
1.Activity在進(jìn)行橫屏切換時(shí)會(huì)生命周期會(huì)執(zhí)行一次,這個(gè)生命周期不是正常所說的連貫的生命周期,會(huì)先調(diào)用onSaveInstanceState()方法,在這里可以進(jìn)行Activity的狀態(tài)保存,然后是onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()->onRestoreInstanceState()->onRsume();
進(jìn)行豎屏切換時(shí)會(huì)調(diào)用2次,
2.如果在Manifest.xml中設(shè)置了Activity的屬性android:configChanges=”orientation|keyboardHidden”,則進(jìn)行橫屏切換的時(shí)候只會(huì)調(diào)用一次onConfigurationChanged()方法,豎屏?xí){(diào)用兩次
按下Home鍵,onSaveInstanceState()-> onPause()->onStop();此時(shí)運(yùn)行別的程序,如果沒被收回內(nèi)存,再運(yùn)行該程序
onRestart()->onStart()->onResume()
Activity未被完全覆蓋只是失去焦點(diǎn):onPause--->onResume
二.Activity的狀態(tài)保存
方法一:通過onSaveInstanceState() 和onRestoreInstanceState()或onCreate()
Back鍵不會(huì)調(diào)用onSaveInstanceState,只有在Home鍵,橫豎屏切換和系統(tǒng)收回Activity的時(shí)候才會(huì)調(diào)用,
onSaveInstanceState的調(diào)用遵循一個(gè)重要原則,即當(dāng)系統(tǒng)“未經(jīng)你許可”時(shí)銷毀了你的activity,則onSaveInstanceState會(huì)被系統(tǒng)調(diào)用,這是系統(tǒng)的責(zé)任,因?yàn)樗仨氁峁┮粋€(gè)機(jī)會(huì)讓你保存你的數(shù)據(jù)。至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對(duì)的被調(diào)用的,onRestoreInstanceState被調(diào)用的前提是,activity A“確實(shí)”被系統(tǒng)銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會(huì)被調(diào)用,例如,當(dāng)正在顯示activity A的時(shí)候,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到activity A,這種情況下activity A一般不會(huì)因?yàn)閮?nèi)存的原因被系統(tǒng)銷毀,故activity A的onRestoreInstanceState方法不會(huì)被執(zhí)
一.關(guān)鍵字:通過參數(shù)Bundle 來進(jìn)行存儲(chǔ)
在onCreate(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceStae)都可以進(jìn)行數(shù)據(jù)的恢復(fù),
從圖中,我們可以看出,onCreate()方法運(yùn)行在onRestoreInstanceState()方法之前。
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- // TODO Auto-generated method stub
- super.onSaveInstanceState(outState);
- Log.i(TAG, "onSaveInstanceState");
- String content = editText.getText().toString();
- if (null != content) {
- outState.putString(TAG, content);
- }
- }
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onRestoreInstanceState(savedInstanceState);
- Log.i(TAG, "onRestoreInstanceState");
- if(null!=savedInstanceState){
- editText.setText(savedInstanceState.getString(TAG));
- }
- }
方法二:通過 Activity的相應(yīng)方法,這里選用onPause() 和onResume()
在這里是通過SharedPreference存儲(chǔ)
- @Override
- protected void onPause() {
- // TODO Auto-generated method stub
- Log.i(TAG, "onPause");
- String content = editText.getText().toString();
- if (null != content) {
- this.getPreferences(MODE_PRIVATE).edit().putString(TAG, content)
- .commit();
- }
- super.onPause();
- }
- @Override
- protected void onResume() {
- // TODO Auto-generated method stub
- Log.i(TAG, "onResume");
- editText.setText(this.getPreferences(MODE_PRIVATE).getString(TAG, ""));
- super.onResume();
- }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。