溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

關(guān)于Activity保存狀態(tài)的研究

發(fā)布時(shí)間:2020-07-02 19:30:59 來源:網(wǎng)絡(luò) 閱讀:564 作者:VincentTung 欄目:開發(fā)技術(shù)

 一.Activity進(jìn)行橫豎屏切換時(shí)候的生命周期

1.運(yùn)行的時(shí)候

 

關(guān)于Activity保存狀態(tài)的研究

2.切橫屏(生命周期執(zhí)行一次)

 

關(guān)于Activity保存狀態(tài)的研究

3.再切豎屏(生命周期執(zhí)行兩次)

 

關(guān)于Activity保存狀態(tài)的研究

重寫返回按鈕事件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返回鍵

 

關(guān)于Activity保存狀態(tài)的研究

按下Home

關(guān)于Activity保存狀態(tài)的研究

按下Home鍵后再次運(yùn)行改程序

關(guān)于Activity保存狀態(tài)的研究

如果將activityandroidconfigChanges=orientation|keyboardHidden屬性設(shè)置后

1, 同上1

2, 

關(guān)于Activity保存狀態(tài)的研究

3, 

關(guān)于Activity保存狀態(tài)的研究

總結(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 AonRestoreInstanceState方法不會(huì)被執(zhí)

一.關(guān)鍵字:通過參數(shù)Bundle 來進(jìn)行存儲(chǔ)

onCreate(Bundle savedInstanceState)onRestoreInstanceState(Bundle savedInstanceStae)都可以進(jìn)行數(shù)據(jù)的恢復(fù),

關(guān)于Activity保存狀態(tài)的研究

從圖中,我們可以看出,onCreate()方法運(yùn)行在onRestoreInstanceState()方法之前。


  1. @Override 
  2. protected void onSaveInstanceState(Bundle outState) { 
  3. // TODO Auto-generated method stub 
  4. super.onSaveInstanceState(outState); 
  5. Log.i(TAG, "onSaveInstanceState"); 
  6. String content = editText.getText().toString(); 
  7. if (null != content) { 
  8. outState.putString(TAG, content); 
  9. @Override 
  10. protected void onRestoreInstanceState(Bundle savedInstanceState) { 
  11. // TODO Auto-generated method stub 
  12. super.onRestoreInstanceState(savedInstanceState); 
  13. Log.i(TAG, "onRestoreInstanceState"); 
  14. if(null!=savedInstanceState){ 
  15. editText.setText(savedInstanceState.getString(TAG)); 

方法二:通過 Activity的相應(yīng)方法,這里選用onPause() onResume()

在這里是通過SharedPreference存儲(chǔ)


  1. @Override 
  2.     protected void onPause() { 
  3.         // TODO Auto-generated method stub 
  4.         Log.i(TAG, "onPause"); 
  5.         String content = editText.getText().toString(); 
  6.         if (null != content) { 
  7.             this.getPreferences(MODE_PRIVATE).edit().putString(TAG, content) 
  8.             .commit(); 
  9.         } 
  10.         super.onPause(); 
  11.     } 
  12.  
  13.     @Override 
  14.     protected void onResume() { 
  15.         // TODO Auto-generated method stub 
  16.         Log.i(TAG, "onResume"); 
  17.         editText.setText(this.getPreferences(MODE_PRIVATE).getString(TAG, "")); 
  18.         super.onResume(); 
  19.     } 

向AI問一下細(xì)節(jié)

免責(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)容。

AI