onSaveInstanceState()とonRestoreInstanceState()の使用の詳細

4609 ワード

背景


システムが通常のアプリケーション動作ではなくシステム制約によってActivityを破壊した場合、実際のActivityインスタンスは消えていますが、システムはすでに存在していることを覚えています.これにより、ユーザーがナビゲートして戻った場合、システムは新しいインスタンスのActivityを作成し、保存されたデータのセットを使用してActivityの破棄時の状態を記述します.システムが以前の状態を復元するために使用する保存されたデータを「インスタンス状態」と呼び、Bundleオブジェクトに格納されたキー値ペアのセットです.

解決する


onSaveInstanceState()とonRestoreInstanceState()がこのような背景で活躍しています.
注意1.ユーザが戻りキーを自動的に押した場合、またはプログラムがfinish()を呼び出してプログラムを終了した場合、onSaveInstanceState()およびonRestoreInstanceState()はトリガーされません.2、ユーザーが画面を回転するたびに、Activityが破壊され、再作成されます.画面が方向を変更すると、フロントActivityが破壊され、再作成されます.画面構成が変更されているため、Activityはレイアウトなどの代替リソースをロードする必要がある場合があります.onSaveInstanceState()とonRestoreInstanceState()が実行されます.

紹介する


デフォルトでは、Bundleインスタンスのステータスを使用して、各オブジェクトのViewActivityレイアウトに関する情報(たとえば、EditTextオブジェクトに入力されたテキスト値)を保存します.したがって、Activityインスタンスが破棄されて再作成されると、レイアウトステータスは自動的に以前のステータスに戻ります.ただし、Activityには、Activityのユーザーの進行状況を追跡するメンバー変数など、リカバリするステータス情報が含まれている場合があります.
Activityの保存済みインスタンスステータスに追加データを追加するには、Activityライフサイクルに追加のコールバックメソッドがあります.これらのコールバックメソッドは、前のレッスンでは表示されません.この方法はonSaveInstanceState()であり,システムはユーザがActivityを離れたときに呼び出す.システムがこのメソッドを呼び出すと、BundleがActivityの予期せぬ破棄イベントに保存するオブジェクトが渡され、追加情報を追加できます.その後、システムが破棄された後にActivityインスタンスを再作成する必要がある場合は、同じBundleオブジェクトがActivityのonRestoreInstanceState()メソッドとonCreate()メソッドに渡されます.
上の図に示すように、Activityを停止し始めるとonSaveInstanceState()(1)が呼び出され、Activityがインスタンスを再作成する必要がないように保存する他のステータスデータを指定できます.Activityが破壊され、同じインスタンスを再作成する必要がある場合、システムは(1)で定義されたステータスデータをonCreate()メソッド(2)およびonRestoreInstanceState()メソッド(3)に渡す.

Activityステータスを保存


Activityが停止し始めると、onSaveInstanceState()が呼び出され、Activityのセットを使用してステータス情報を保存できます.このメソッドのデフォルトインプリメンテーションでは、Activityビューの階層状態に関する情報が保存されます.たとえば、EditTextウィジェットのテキストやListViewのスクロール位置などです.
Activityの追加ステータス情報を保存するには、onSaveInstanceState()を実装し、Bundleのキー値ペアをオブジェクトに追加する必要があります.例:
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    //  
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    //  , 
    super.onSaveInstanceState(savedInstanceState);
}

Activityステータスの復元


Activityが以前に破壊された後に再作成されると、BundleシステムからActivityで保存状態を復元できます.両方のメソッドonCreate()とonRestoreInstanceState()コールバックメソッドは、Bundleがインスタンスのステータス情報を含む同じメソッドを受信します.
onCreate()は、メソッドが新しいActivityインスタンスを作成しているか、または以前のインスタンスを再作成しているかを呼び出すため、Bundleが読み取りを試みる前にステータスが空であるかどうかを確認する必要があります.空の場合、システムはリカバリ前に破棄されたインスタンスではなく、Activityの新しいインスタンスを作成しています.
たとえば、次のようにしてステータスデータonCreate()を復元します.
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); //  

    //  
    if (savedInstanceState != null) {
        //  
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        //  
    }
    ...
}

onCreate()システムがonStart()メソッドを呼び出した後にステータスを復元するのではなく、onRestoreInstanceState()を実行することを選択できます.システムonRestoreInstanceState()は、保存状態がある場合にのみリカバリされるため、Bundleが空であるかどうかを確認する必要はありません.
public void onRestoreInstanceState(Bundle savedInstanceState) {
    //  , 
    super.onRestoreInstanceState(savedInstanceState);

    //  
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

終啦.