ActivityとFragmentステータスの保存とリカバリ

4523 ワード

Activity状態の保存と復元


  Activityがkilledされるか、または構成が変更される前にonSaveInstanceState (Bundle)が呼び出され、onCreate(Bundle)またはonRestoreInstanceState(Bundle)において回復するためにActivity状態が保存される.通常のライフサイクルでは、onSaveInstanceState (Bundle)およびonRestoreInstanceState(Bundle)は呼び出されません.
  onSaveInstanceState (Bundle)は、onStop()の前に呼び出されるが、onPause()との呼び出し順序は保証されない.onRestoreInstanceState(Bundle)の呼び出しは、onStart()およびonPostCreate(Bundle)の間で発生する.
デフォルトのインプリメンテーションは、Activityレイアウトの各onSaveInstanceState (Bundle)属性が設定されたViewのandroid:idを呼び出すことによって、各Viewの状態を保存することである.その後、onSaveInstanceState (Bundle)において、対応するidに従ってViewの状態が回復される.
したがって、Viewの状態を保存して復元するには、次の2つの点を満たす必要があります.
  • は、onRestoreInstanceState(Bundle)およびonSaveInstanceState (Bundle)において状態を保存および回復する.
  • は、idに従ってView状態を回復するためにonRestoreInstanceState(Bundle)を設定する.

  •  TextViewは、android:idを設定するだけでなく、android:idを設定して状態を保存する必要があります.TextViewのandroid:freezesText="true"メソッドを表示します.変数onSaveInstanceState (Bundle)mFreezesTextの場合、TextViewの状態が保存されます.
    Activityステータスの保存とリカバリの手順は、次のとおりです.
    したがって、Activityのメンバー変数については、手動で保存およびリカバリする必要があります.
       private int countCanRestored = 0;
    
       @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putInt("countCanRestored", countCanRestored);
        }
    
        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
            countCanRestored = savedInstanceState.getInt("countCanRestored", 0);
            ...
        }
    

    Fragment状態の保存と復元


      システムリソースが不足し、Fragmentが破棄されたり、構成が変更されたりした場合、Fragment状態の保持とリカバリはActivityと同様です.
    Activity状態の保存と復元の手順は次のとおりです.ただし、FragmentにはtrueメソッドはありませんonSaveInstanceState(Bundle)メソッド.それに対してFragmentはonRestoreInstanceState(Bundle) , onCreate(Bundle) , onCreateView(LayoutInflater, ViewGroup, Bundle)メソッドでは、Viewステータスとメンバー変数が復元されます.注意が必要なのはBundleが空である可能性があり、使用前に判断する必要があります.
    次に、2つの比較的特殊な状況を考慮します.
  • onActivityCreated(Bundle)  構成が変化した場合、FragmentはActivityの破壊に伴って破壊されず、Fragmentのインスタンスは存在するが、setRetainInstance(true);メソッドが呼び出され、Viewは破壊される.Fragmentのメンバー変数とViewステータスは、システムによって自動的に保存され、復元されます.onDestroyView()メソッドおよびonSaveInstanceState(Bundle)メソッドおよびonActivityCreated(Bundle)メソッドが呼び出されます.onCreateView(LayoutInflater, ViewGroup, Bundle)は呼び出されません.
  • FragmentはActivityのonCreate(Bundle)から回復した.Fragmentのインスタンスは破棄されず、back stackメソッドが呼び出され、Viewは破棄された.Fragmentのメンバー変数とViewステータスは、システムによって自動的に保存され、復元されます.onDestroyViewおよびonSaveInstanceStateは呼び出されなかった.onCreate(Bundle)メソッドとonActivityCreated(Bundle)メソッドが呼び出されます.

  • ActivityとFragmentの状態を維持して回復する正しい姿勢は:

  • は、ステータスの保存と復元が必要なViewがonCreateView(LayoutInflater, ViewGroup, Bundle)onSaveInstanceState (Bundle)の2つの方法を書き換えていることを確認します.一部のViewでは、TextViewがonRestoreInstanceState(Bundle)を設定する必要があるなど、手動でこの機能をオンにする必要があります.サードパーティ製カスタムビューを使用する場合は、この2つの方法が実装されていることを確認する必要があります.もしなかったら、このViewを継承して、この2つの方法を書き換えることができます.私たち自身がViewをカスタマイズするときも、この2つの方法を実現することを覚えておいてください.
  • は、状態を保存および復元する必要があるビューにandroid:freezesText="true"を設定する.
  • ActivityおよびFragmentのインスタンス変数を保存および復元します.

  • Reference:inthecheesefactory.com/blog/fragme…