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)
において状態を保存および回復する.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)
は呼び出されません.onCreate(Bundle)
から回復した.Fragmentのインスタンスは破棄されず、back stack
メソッドが呼び出され、Viewは破棄された.Fragmentのメンバー変数とViewステータスは、システムによって自動的に保存され、復元されます.onDestroyView
およびonSaveInstanceState
は呼び出されなかった.onCreate(Bundle)
メソッドとonActivityCreated(Bundle)
メソッドが呼び出されます.ActivityとFragmentの状態を維持して回復する正しい姿勢は:
onCreateView(LayoutInflater, ViewGroup, Bundle)
とonSaveInstanceState (Bundle)
の2つの方法を書き換えていることを確認します.一部のViewでは、TextViewがonRestoreInstanceState(Bundle)
を設定する必要があるなど、手動でこの機能をオンにする必要があります.サードパーティ製カスタムビューを使用する場合は、この2つの方法が実装されていることを確認する必要があります.もしなかったら、このViewを継承して、この2つの方法を書き換えることができます.私たち自身がViewをカスタマイズするときも、この2つの方法を実現することを覚えておいてください.android:freezesText="true"
を設定する.Reference:inthecheesefactory.com/blog/fragme…