Android基礎部分再学習---activityの状態保存


主にbundleというパラメータです
参照先:http://blog.csdn.net/lonelyroamer/article/details/18715975
Activityのライフサイクルを学ぶと、Activityがpausedまたはstopped状態に入った後も、このActivityの状態は保存されていることがわかります.このActivityオブジェクトはメモリに保存されているため、すべての情報と状態は依然として存在し、このActivityが再びフロントに戻ると、まだ離れたままです.
しかし、Activityがバックグラウンドに入ると、メモリを回収するためにActivityが破棄される可能性があります.このActivityオブジェクトは、ユーザがナビゲーションで返すと簡単に復元できず、再作成されます.しかし、一般ユーザーにとっては、システムがActivityを破棄して再作成したことを知らないため、Activityが彼が離れたときと同じ状態を保存することを望んでいる可能性があります.
この場合、Activityの重要な情報をコールバックメソッドonSaveInstanceState()で保存し、onCreate()またはonRestoreInstanceState()コールバックメソッドでリカバリできます.
[java]  view plain
 copy
 
@Override  
protected void onSaveInstanceState(Bundle outState) {  
    super.onSaveInstanceState(outState);  
    Log.d("roamer", "onSaveInstanceState");  
}  
  
@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  
    Log.d("roamer", "onCreate");  
}  
  
@Override  
protected void onRestoreInstanceState(Bundle savedInstanceState) {  
    super.onRestoreInstanceState(savedInstanceState);  
    Log.d("roamer", "onRestoreInstanceState");  
}  
onSaveInstanceState()メソッドで渡されたBundleオブジェクトには、私たちが保存したいものが格納されます.その後、Activityが再作成されると、onCreate()またはonRestoreInstanceState()メソッドのBundleオブジェクトを使用して、以前に保存したデータを取得できます.Bundleの使い方については、あまり言わないでください.
手順は次の図です.
Android基础部分再学习---activity的状态保存_第1张图片
注意:Activityが破棄されるたびに、システムがonSaveInstanceState()メソッドに戻るわけではありません.私たちは自分でfinishがActivityを削除するので、onSaveInstanceState()メソッドは呼び出されません.
また,システムがonSaveInstanceState()メソッドを呼び出すタイミングは一般にonStop()より前であるが,onPauseより前である可能性もある.
また、システムがonRestoreInstanceState()を呼び出すタイミングは、onStart()の後、onResumeの前です.
Activity状態保存のデフォルトメカニズム
しかし、onSaveInstanceState()メソッドを書き換えなくても、onSaveInstanceState()メソッドのデフォルトの実装に対してActivityは、いくつかの状態を回復するのに役立ちます.具体的には、デフォルトのインプリメンテーションは、Activityレイアウト内の各ViewのonSaveInstanceState()メソッドを呼び出すのに役立ちます.ViewのonSaveInstanceState()メソッドは次のとおりです.
[java]  view plain
 copy
 
//ViewのonRestoreInstanceState()メソッド//この方法では、各Viewが保存する必要がある情報を提供することができる@Override  
protected void onRestoreInstanceState(Parcelable state) {  
    // TODO Auto-generated method stub  
    super.onRestoreInstanceState(state);  
}  
ほとんどのAndroidフレームワークのwidgetは、再作成時に可視UI変更アクティビティが自動的に保存され、リカバリされるように、この方法を適切に実現しています.たとえば、EditTextコンポーネントは、ユーザが入力したテキストを保存し、CheckBoxコンポーネント保存が選択されているかどうかを確認します.
私たちが唯一しなければならない仕事は、widgetごとにステータスを保存する唯一のID(android:IDプロパティ)を提供することです.1つの部品にIDがない場合、システムはその状態を保存できません.もちろん、特定の場合、ビューのステータスを自動的に保存して復元する必要がない場合は、ビューのプロパティandroid:saveEnabledをfalseに設定したり、setSaveEnabled()メソッドを呼び出したりすることができます.
システムはUI構築の自動保存とリカバリを実現しますが、他のメンバー変数を保存してリカバリする必要がある場合があります.この場合、onSaveInstanceState()とonRestoreInstanceState()を書き換える方法は、システムUIコンポーネントの自動保存とリカバリのデフォルトの実装であるため、superメソッドの実装を忘れないでください.
注意:onSaveInstnceState()メソッドはActivityが破棄される前に必ず実行されるわけではないので、Activityステータスに関する情報(UIステータス)だけを保存したほうがいいです.永続化されたデータを保存するべきではありません.永続化されたデータはonPauseメソッド(データベースにデータを格納するなど)に保存する必要があります.
Activity状態保存のテスト方法
ActivityがonSaveInstanceState()を呼び出す方法はタイミングがいいですが、onRestoreInstanceState()を呼び出すと少し制御しにくいです.システムメモリが足りないまでActivityを破棄するのは難しいからです.そこで、Activityの状態保存を次の方法でテストすることができます.
つまり、画面方向を変化させる回転設定です(もちろん、設定をロックする回転機能がなく、Activityも画面方向を設定していないことが前提です).画面方向が変化すると、新しい画面構成の代替リソースが見つかり、Activityが破棄され、再構築されます.
Activityの状態保存、私たちの最も主要な問題は3つあります.
1.onSaveInstancesStateこのメソッドはいつ実行されますか.彼は必須ではなく、activityライフサイクルで必須のプロセスではないからです.
onSaveInstanceState()は、ActivityまたはFragmentの破棄を自動的にクリーンアップする前に呼び出されます.
言い換えれば、あなた自身finishは呼び出さないに違いありません.システムが自分でトリガーしなければなりません.
たとえば
1、重力誘導携帯電話が縦画面から横画面に変わるため、
2,携帯電話はHomeキーをクリックしてと長いHomeキーを押します
3、電源キーを押して画面をロックする時
4現在のActivityから別のActivityにジャンプ
5、アプリケーションメモリ不足が自動破棄される場合
2.onSaveInstancesState彼が保存しているデータは保有化されているのか、それとも永久的なのか.
onSaveInstanceState() 
この方法は非永久的なデータを一時的に保存するのに適している.データを永続的に保存するには、onStop()、onDestroy()などのメソッドに操作を配置します.
こうしてonSaveInstanceState()の役割は、
onSaveInstanceState()は、現在のActivityまたはFragmentがシステムによって自分で破棄されると、アプリケーションはその前に必要なデータを保存することができ、ユーザーの操作はすぐに現在のページに戻り、このときデータは失われず、最大限の回復前の状態になる.これがこの方法の最大の意味です
3.どのように書き直すかという問題は、どのように自分でデータを保存するかということで、bundleモード、つまりkey-valueモードを使っています
Androidのデザインでは、この関数の主な役割はUI状態を保存することなので、今どのように自分のデータを保存しますか?
保存:
@Override
public void onSaveInstanceState(Bundle outState){
       super.onSaveInstanceState(outState);
       String content = etCon.getText().toString();
       outState.putString("inputCon", content);
}
取り出し:
@Override
public void onViewStateRestored(Bundle savedInstanceState){
<span style="white-space:pre">	</span>super.onViewStateRestored(savedInstanceState);
<span style="white-space:pre">	</span>//          
<span style="white-space:pre">	</span>if(savedInstanceState != null){
<span style="white-space:pre">		</span>etCon.setText(savedInstanceState.getString("inputCon", ""));
	}
}

ステータス保存の主な使用は、縦画面切り替えのほか、fragmentの置き換え時に花画面の問題を解決するために使用できます.