2010年12月6日月曜日

Activityの状態を保存

主に、システムにActivityが強制終了させられる(システムにActivityが殺される)場合は、下記の3通りになります。

1.メモリ不足
2.長期間利用なし
3.画面の向き変更

この後、Activityは再起動される時があります(3番はすぐに再起動されます)。

通常は再開時にオブジェクトのフィールド値など、全てのデータは初期化されてしまいますが、何事もなかったかのようにActivityを再開する目的で一時的にデータを退避させておく仕組みがBundleです。

public class MainActivity extends Activity {

    int mInteger;
    ArrayList<Integer> mArray;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ArrayList<Integer> mArray = (ArrayList<Integer>) getLastNonConfigurationInstance();
        if ( mArray == null ) {
            mArray = new ArrayList<Integer>();
            mArray.add(mInteger);
        }
    }

    // onCreateより後に呼ばれる。初期起動時は呼ばれない
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {  
        super.onRestoreInstanceState(savedInstanceState);

        // Bundleよりデータを復元する
        // int getInt("キー名", 存在しない場合のデフォルト値);
        mInteger = saveInstanceState.getInt("integer", 0);
            mArray.add(mInteger);
    }

    // Activity終了時に呼ばれる
    @Override
    public Object onRetainNonConfigurationInstance() {
        // 保存オブジェクトを返す
        return mArray;
    }

    // Activity終了時に呼ばれる
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        // Activity再開時に渡すデータをBundle
        outState.putInt("integer", mInteger);
    }
}

0 件のコメント:

コメントを投稿