Android中用onSaveInstanceState保存Fragment狀態(tài)的方法
在Fragment里面,利用onSaveInstanceState保存數(shù)據(jù),并可在onActivityCreated里面恢復(fù)數(shù)據(jù)。
public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ... if (savedInstanceState != null) { // Restore the fragment's state here } } public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // Save the fragment's state here }
在Activity里面,利用onSaveInstanceState保存Fragment實(shí)例的數(shù)據(jù),并可在onCreate里面恢復(fù)數(shù)據(jù):
private Fragment myFragment; public void onCreate(Bundle savedInstanceState) { ... if (savedInstanceState == null) { // Instantiate fragment } else { // Restore the fragment's instance myFragment = getSupportFragmentManager().getFragment( savedInstanceState, "fragment"); } ... } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //Save the fragment's instance // fragment instance may be null if (myFragment != null) { getSupportFragmentManager().putFragment(outState, "fragment", myFragment); } }
實(shí)例
首先看一個(gè)步驟,如果是人為關(guān)閉Activity或者Fragment, 比如點(diǎn)擊了后退鍵,主動(dòng)關(guān)閉當(dāng)前頁(yè)面,就會(huì)走 onPause() --> onStop() --> onDestroy() 而onSaveInstanceState() 并不會(huì)被調(diào)用. onSaveInstanceState() 只有在系統(tǒng)即將要自動(dòng)清理銷毀Activity或Fragment前才會(huì)調(diào)用, 比如
1, 由于重力感應(yīng) 手機(jī)從豎屏變?yōu)闄M屏,
2, 手機(jī)點(diǎn)擊Home鍵和長(zhǎng)按Home鍵
3, 點(diǎn)擊電源鍵鎖屏?xí)r
4, 從當(dāng)前Activity跳到另一個(gè)Activity
5, 應(yīng)用內(nèi)存不足即將自動(dòng)銷毀時(shí)等情況
綜合上面的情況,可以看出, onSaveInstanceState() 這個(gè)方法適合臨時(shí)保存一些非永久性的數(shù)據(jù).如果要持久化保存數(shù)據(jù),就要將操作放在onStop(), onDestroy()這些方法中去.onSaveInstanceState() 適合的是當(dāng)前Activity或者Fragment一旦被系統(tǒng)自己銷毀,應(yīng)用還能在這之前保存一些必要的數(shù)據(jù), 并且用戶的操作很快又回到當(dāng)前這個(gè)頁(yè)面,這個(gè)時(shí)候數(shù)據(jù)并沒有丟失,還能最大程度的恢復(fù)之前狀態(tài).這就是這個(gè)方法最大的意義.下面上例子做個(gè)簡(jiǎn)單示例:
在Fragment中:
//系統(tǒng)自動(dòng)銷毀Fragment前保存必要的數(shù)據(jù) @Override public void onSaveInstanceState(Bundle outState){ <span style="white-space:pre"> </span>super.onSaveInstanceState(outState); <span style="white-space:pre"> </span>String content = etCon.getText().toString(); <span style="white-space:pre"> </span>outState.putString("inputCon", content); } //恢復(fù)數(shù)據(jù) @Override public void onViewStateRestored(Bundle savedInstanceState){ <span style="white-space:pre"> </span>super.onViewStateRestored(savedInstanceState); <span style="white-space:pre"> </span>//恢復(fù)之前輸入框的內(nèi)容 <span style="white-space:pre"> </span>if(savedInstanceState != null){ <span style="white-space:pre"> </span>etCon.setText(savedInstanceState.getString("inputCon", "")); } }
在Activity中
//系統(tǒng)自動(dòng)銷毀Activity前保存必要的數(shù)據(jù) @Override public void onSaveInstanceState(Bundle outState){ <span style="white-space:pre"> </span>super.onSaveInstanceState(outState); String content = etCon.getText().toString(); outState.putString("inputCon", content); } //Activity中可在onRestoreInstanceState()方法恢復(fù)數(shù)據(jù),也可以在onCreate()中恢復(fù),因?yàn)锳ctivity一旦被銷毀就會(huì)重走一次onCreate()開始的正常生命周期 @Override public void onRestoreInstanceState(Bundle savedInstanceState){ super.onRestoreInstanceState(savedInstanceState); //恢復(fù)之前輸入框的內(nèi)容 if(savedInstanceState != null){ etCon.setText(savedInstanceState.getString("inputCon", "")); } } @Override public void onDestroy(){ super.onDestroy(); //Activity被銷毀前可進(jìn)行最后一次數(shù)據(jù)的保存,過(guò)了這村就沒這店了. }
這里有個(gè)重要的點(diǎn),上面的上面所提及的onSaveInstanceState()方法只有在Activity或Fragment確定要被系統(tǒng)自動(dòng)清除時(shí),才會(huì)被調(diào)用,如果不是長(zhǎng)期后臺(tái)應(yīng)用,頁(yè)面沒有被系統(tǒng)kill掉,對(duì)應(yīng)的Activity或Fragment也就不會(huì)調(diào)用onSaveInstanceState()這些方法.
- android中Activity詳解(生命周期、以各種方式啟動(dòng)Activity、狀態(tài)保存,完全退出等)
- Android保存Activity狀態(tài)的方法
- Android學(xué)習(xí)小結(jié)之Activity保存和恢復(fù)狀態(tài)
- Android 保存Fragment 切換狀態(tài)實(shí)例代碼
- 實(shí)例探究Android開發(fā)中Fragment狀態(tài)的保存與恢復(fù)方法
- android初學(xué)者必須掌握的Activity狀態(tài)的四大知識(shí)點(diǎn)(必讀)
- Android編程實(shí)現(xiàn)隱藏狀態(tài)欄及測(cè)試Activity是否活動(dòng)的方法
- Android中檢查、監(jiān)聽電量和充電狀態(tài)的方法
- Android中監(jiān)聽軟鍵盤顯示狀態(tài)實(shí)現(xiàn)代碼
- Android編程實(shí)現(xiàn)狀態(tài)保存的方法分析
相關(guān)文章
Android ListView彈性效果的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了Android ListView彈性效果的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-05-05Android開發(fā)之Activity管理工具類完整示例
這篇文章主要介紹了Android開發(fā)之Activity管理工具類,集合完整實(shí)例形式分析了Android操作Activity創(chuàng)建、添加、獲取、移除等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Android 按后退鍵退出Android程序的實(shí)現(xiàn)方法
本篇文章介紹了,在Android中按后退鍵退出Android程序的實(shí)現(xiàn)方法。需要的朋友參考下2013-04-04Android開發(fā)實(shí)現(xiàn)在TextView前面加標(biāo)簽示例
這篇文章主要為大家介紹了Android開發(fā)實(shí)現(xiàn)TextView前面加標(biāo)簽示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04