Activity銷燬時如何保存Fragment狀態

轉載請標明出處:
http://blog.csdn.net/a940659387/article/details/50730076

原文:http://emuneee.com/blog/2013/01/07/saving-fragment-states/
在Android 3.0(SDK 11)以後,Android 出現了一個偉大的功能:如何在你的App中保存和還原你的Framgent數據。

它是什麼

我再我下一個App開發中期的時候參考Android API時,偶然發現  FragmentManager.putFragment(Bundle, String, Fragment) and FragmentManager.getFragment(Bundle, String) 這兩個方法。它們的作用?

putFragment

將一個Fragment的引用傳遞到Bundle中。這個Bundle可以一直保存它的數據,以後通過調用
getFragment(Bundle, String)方法得到一個一樣的Fragmet 實例。

getFragment

取回一個先前通過 putFragment(Bundle, String, Fragment).方法存儲的fragment實例。

根據我的理解,當你把當前的Fragment放置到bundle中,他會保存一個的指針指向這個fragment的地址;當你調用getFragment()方法時,它將返回你通過putFragment保存的指針對應的Fragment實例。

你也可以通過使用FramgentManager APIs 去保存一個fragment 對應的指針(我感覺叫引用更好) 到bundle中 在以後用到時取出。它也允許你實現這個指針的存儲跟取出(還原)。

    ---Diane Hackborn ,Android 架構師。  [Source](https://groups.google.com/forum/?fromgroups=#!topic/android-developers/NBlMJnMaGbo)

如何去使用它

一個使用這個API的方法是在我的這個Acticity的創建和銷燬的時候。自fragment出現以來,我通常用兩個Activity來使用它,一個是我的activity,另一個用來設置Fragment。我再我的activity中管理fragment.

putFragment

在activity的 onSaveInstanceState 像這樣使用:

@Override
protected void onSaveInstanceState(Bundle outState) {
   FragmentManager manager = getFragmentManager();
   manager.putFragment(outState, MyFragment.TAG, mMyFragment);
}

MyFragment 是一個在我應用中創建的Fragment,這個bundle,outState,只是一個簡單的bunlde,它將存儲你fragment(即MyFragment)對應的引用(指針)。 MyFragment.TAG 是你的fragment指針以後會用到的key值。

GetFragment

我有一個自定義方法(instantiateFragments) ,它會做一到兩件事情:當我的應用是冷啓動時抓取我的fragment實例 或者 獲得現在的MyFragment內容。

private void instantiateFragments(Bundle inState) {
   FragmentManager manager = getFragmentManager();
   FragmentTransaction transaction = manager.beginTransaction();

   if (inState != null) {
      mMyFragment = (MyFragment) manager.getFragment(inState, MyFragment.TAG);
   } else {
      mMyFragment = new MyFragment();
      transaction.add(R.id.fragment, mMyFragment, MyFragment.TAG);
      transaction.commit();
   }
}

我在我的activity中調用instantiateFragments 這個方法,onRestoreInstanceState傳入的參數爲null時(onCreate 方法通過冷啓動觸發),當通過熱啓動觸發時,傳入的參數爲bundle.

@Override
protected void onRestoreInstanceState(Bundle inState) {
   instantiateFragments(inState);
}

當用戶旋轉設備時,Android 將銷燬Activity,並在銷燬前觸發onSaveInstanceState,允許開發者來
保存數據。一旦activity被重新啓動,這個OS 將觸發onRestoreInstanceState 恢復開發者旋轉前的保存的狀態。

我鼓勵你繼續更深調查Android框架。因爲所有類型都有細微的差別,他們將簡化Android應用程序開發工作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章