onCreate onRestoreInstanceState onSaveInstanceState

4131 ワード

1.activityのライフサイクルでは、可視段階を離れたり、焦点を失ったりすれば、activityはプロセスによって終了する可能性が高い!、KILLに落とされた場合、その時の状態を保存できる仕組みが必要です.これがsavedInstancesStateの役割です.
2.ActivityのonCreate(Bundle savedInstanceState)関数では、savedInstanceStateというパラメータは、各UIの情報とユーザがカスタマイズして格納した情報を含むActivityの情報を格納するために使用されます.
3.
各インスタンスを保存するステータスは、activityが殺される前に呼び出され、onCreate(Bundle)またはonRestoreInstanceState(Bundle)(入力されたBundleパラメータはonSaveInstanceStateによってカプセル化された)でリカバリできることを保証します.この方法はactivityが殺される前に呼び出され、activityが将来のある時点で戻ってきたときに以前の状態を回復することができる.たとえば、activity Bが有効になってactivity Aの先頭にある場合、ある時点でactivity Aがシステム回収リソースの問題で殺されると、AはonSaveInstanceStateを介してそのユーザインタフェースの状態を保存する機会があり、将来のユーザがactivity Aに戻ったときにonCreate(Bundle)またはonRestoreInstanceState(Bundle)を介してインタフェースの状態を回復することができる.
4.onPause()を呼び出すがonSaveInstanceStateを呼び出さない例は、activity Bが起動してactivity Aのフロントエンドにある場合です.Bのライフサイクル全体でAのユーザーインタフェース状態が破壊されなければ、システムはactivity AのonSaveInstanceState(Bundle)を呼び出すことはありません.
5.
package com.myandroid.test;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class AndroidTest extends Activity {
    private static final String TAG = "MyNewLog";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // If an instance of this activity had previously stopped, we can
        // get the original text it started with.
        if(null != savedInstanceState)
        {
            int IntTest = savedInstanceState.getInt("IntTest"); 
            String StrTest = savedInstanceState.getString("StrTest"); 
            Log.e(TAG, "onCreate get the savedInstanceState+IntTest="+IntTest+"+StrTest="+StrTest);  
        }

        setContentView(R.layout.main);
        Log.e(TAG, "onCreate");
    }

    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
      // Save away the original text, so we still have it if the activity
      // needs to be killed while paused.
      savedInstanceState.putInt("IntTest", 0); 
      savedInstanceState.putString("StrTest", "savedInstanceState test"); 
      super.onSaveInstanceState(savedInstanceState); 
      Log.e(TAG, "onSaveInstanceState");
    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
      super.onRestoreInstanceState(savedInstanceState); 

      int IntTest = savedInstanceState.getInt("IntTest"); 

      String StrTest = savedInstanceState.getString("StrTest"); 

      Log.e(TAG, "onRestoreInstanceState+IntTest="+IntTest+"+StrTest="+StrTest);
    } 
}

あるactivityが「容易」にシステムによって破棄されると、例えばユーザがBACKキーを押すと、activityがユーザによって自発的に破棄されない限り、activityのonSaveInstancesStateが実行される.上の二重引用符に注意してください.「簡単」とは何ですか.このactivityはまだ破棄されておらず、可能性にすぎないという意味だ.この可能性はどれらがありますか?onSaveInstanceStateメソッドとonRestoreInstanceStateメソッドを含むactivityのすべてのライフサイクルのonXXXメソッドを書き換えることで、あるactivity(activity Aと仮定)が現在のtaskの最上位に表示された場合、そのonSaveInstanceStateメソッドがいつ実行されるかを明確に知ることができます.1、ユーザーがHOMEキーを押すと.これは明らかで、システムはあなたがHOMEを押した後にどれだけ他のプログラムを実行するかを知らないで、もちろんactivity Aが破棄されるかどうか分からないので、システムはonSaveInstancesStateを呼び出して、ユーザーにいくつかの非永久的なデータを保存する機会を与えます.以下のいくつかのケースの分析は、この原則2に従い、HOMEキーを長く押して、他のプログラムを実行する場合を選択します.3、電源ボタン(画面表示をOFF)を押した場合.4、activity Aから新しいactivityを起動する場合.5、画面方向切り替えの場合、例えば縦画面から横画面に切り替えた場合.画面切り替え前にactivity Aが破棄され、画面切り替え後に自動的にactivity Aが作成されるので、onSaveInstanceStateは必ず実行されます.要するに、onSaveInstanceStateの呼び出しは、システムが「許可されていない」ときにactivityを破棄すると、onSaveInstanceStateがシステムに呼び出されるという重要な原則に従います.これはシステムの責任です.データを保存する機会を提供しなければならないからです(もちろん、保存しないなら勝手にしてください).onRestoreInstanceStateメソッドについては、onSaveInstanceStateメソッドとonRestoreInstanceStateメソッドの「必ずしも」がペアで呼び出されるとは限らず、onRestoreInstanceStateが呼び出される前提は、activity Aが「確かに」システムによって破棄され、その可能性がある場合にのみ、このメソッドは呼び出されず、例えばactivity Aが表示されている場合、ユーザはHOMEキーを押してメインインタフェースに戻り、その後、ユーザはactivity Aに戻る.この場合、activity Aは一般的にメモリの原因でシステムによって破棄されないため、activity AのonRestoreInstancesStateメソッドは実行されない.また、onRestoreInstanceStateのbundleパラメータもonCreateメソッドに渡され、onCreateメソッドでデータ復元を選択することもできます.