Android公式開発文書Trainingシリーズ中国語版:Activityのライフサイクルを管理するActivityの再建…

5105 ワード

原文の住所:http://android.xsoftlab.net/training/basics/activity-lifecycle/recreating.html#RestoreState
いくつかのactivityが正常なルートを通じて破棄される場面があります.例えば、ユーザーがリターンボタンを押したり、activityで終了信号finishを呼び出したりします.システムはactivityが停止した状態で破壊されるかもしれません.長期間使わない時に破壊されるかもしれません.現在のデスクactivityがもっと多くの資源を必要とする場合もあります.システムはバックグラウンドを切ってメモリを復元する時に破壊しなければなりません.
activityはユーザーがリターンボタンを押したり、自分で閉じたりして廃棄されると、システムはactivityの実例が永遠に消えたと考えています.しかし、activityがシステムリソースの枯渇によって破壊された場合、activityのインスタンスはすでに破壊されていますが、システムは、ユーザーが戻ってきたときにシステムが新しいactivityのインスタンスを作成し、前のactivity販売時に保存された一連のデータを通じて当時の状態を回復するために存在したことを覚えています.システムが元の状態に戻った時にinstance stateというオブジェクトを通して格納されたデータは、Bundleオブジェクトであり、キーのペアでデータのセットを格納します.
警告:ユーザーがスクリーンを回転するたびに、activityは破棄され、再作成されます.画面の向きが変わると、システムは破壊され、現在のactivityを再作成します.画面の配置が変わったため、activityは変更されたリソース(例えばレイアウト)をロードする必要があるかもしれません.
デフォルトでは、システムは、Bundleオブジェクトを使用して、activityがキュッとしない各Viewオブジェクトの情報(例えば、EditTextに入力された内容)を格納する.したがって、activityオブジェクトを廃棄して再作成すれば、コードを書く必要がなく、レイアウトの状態を元の状態に戻すことができます.しかし、activityは、activityにユーザの進捗を記録するメンバ変数など、より多くの状態情報を回復する必要があるかもしれない.
Note:Androidシステムがactivityのviewの状態を保存できるようにするためには、各VIEWは一意のIDを持つ必要があります.android:id属性をサポートします.
activity状態の付加データを保存するために、on SaveInstance State方法を書き換えなければなりません.システムはユーザが離れる時にこの方法を呼び出し、Bundleオブジェクトを転送します.このオブジェクトはactivityが突然破壊されたイベントに保存するために使用できます.システムが後でactivityのインスタンスを作成しなければならない場合、システムはonResetone Instance State方法とオンクリアー方法で同じBundeleオブジェクトを伝達します.
システムがactivityを停止し始めると、on SaveInstance State(1)を呼び出すので、後で回復する時に必要な追加の状態データを指定できます.activityが破壊されて、同じインスタンスを再作成しなければならない場合、システムはオンクリアー方法(2)とオンデマンド・インスタトリー(3)の方法でデフォルトのステータス・データを転送します.
Activityの状態を格納します.
activityが停止状態に入るにつれて、システムはオンサベInstance State方法を呼び出すので、activityは一連の状態情報を格納することができます.この方法のデフォルト実装は、EditText空間におけるコンテンツ、またはListViewのスライド位置など、activityのviewレベルに関するいくつかの情報を保存することである.
activityの付加状態情報を保存するためには、on SaveInstance State方法を実現してからキーをBundleオブジェクトに追加する必要があります.
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}
警告:常にオンザブInstance Stateを呼び出している親が実現しているため、デフォルトではviewレベルを保存できる状態を実現しています.
Activityの状態を回復します.
これまでのactivityが廃棄された後に再作成されたら、Bundleオブジェクトを通じて保存状態を回復することができます.onCreate方法とonsaveInstance State方法は同じBundeleオブジェクトをパラメータで戻します.
onCreate方法はシステムが新しいインスタンスを作成する時に呼び出されるので、それにアクセスする前にBundleオブジェクトがnullかどうかを確認しなければなりません.もしnullであれば、システムは新しいactivityオブジェクトを作成しました.そうでなければ、元のオブジェクトは破棄されました.ここでまた新たに作成しました.
以下はどうやってオンクリアー法でいくつかの状態データを回復するかの例である.
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}
onCreate方法は状態を回復する以外に、onRestree Instance State()方法も同様にこの機能を実現できます.この方法はオンストップメソッドの後で呼び出しますが、データを保存してから呼び出しますので、Bundeleオブジェクトがnullかどうかを確認する必要はありません.
public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
警告:常にオンストリップInstance Stateを呼び出しているので、デフォルトではviewレベルを回復することができます.
運転中の再起動イベントによるactivityの再作成(スクリーン回転など)については、Handling Runtime Changsを参照してください.