Activityの回收

Activityが回收された後のデータ処理

Activityが停止状態になると、システムによって回收される可能性があります。

例えば、Activity A から Activity B を起動した場合、Activity A は停止状態になります。このとき、メモリ不足などによりシステムが Activity A を回收し、その後ユーザーが戻るボタンを押して Activity A に戻ったとします。

この場合、Activity A は通常通り表示されますが、onRestart() は呼ばれず、代わりに onCreate() が実行され、Activity A が新しく作成し直されます。

もし Activity A に一時的なデータ(例えばテキストボックスに入力された文字列など)があった場合、回收されるとそのデータはすべて失われてしまいます。

このようなことがアプリで発生すると、ユーザーエクスペリエンスに悪影響を及ぼします。

幸い、Android には onSaveInstanceState() というコールバックメソッドが用意されており、Activity が回收される直前に必ず呼び出されます。

そのため、この仕組みを使えば回收前の一時データを保持することができます。

onSaveInstanceState() メソッドには、Bundle 型のパラメータが渡されます。

Bundle クラスには、データを保存するためのメソッドが用意されています。例えば、文字列を保存する putString() や、整数を保存する putInt() などです。

onSaveInstanceState メソッドのオーバーライド

// 日本語
@Override
protected void onSaveInstanceState(Bundle outState) { // このメソッドは、Activityが回收される前に呼び出される
    super.onSaveInstanceState(outState);
    outState.putString("user_name", "潘さん");
}Code language: JavaScript (javascript)
// 日本語
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.e(TAG, "onCreate: ");

    if (savedInstanceState != null) // onCreate内でBundleにデータが含まれているか確認できる。データがあれば、Activityが回收されて再作成されたことを意味する
    {
        Log.e(TAG, savedInstanceState.getString("user_name"));
    }
}Code language: JavaScript (javascript)

再作成時にBundleデータを取得する

onCreate メソッドでは、システムから Bundle 型のパラメータが渡されます:

// 日本語
protected void onCreate(Bundle savedInstanceState) {Code language: JavaScript (javascript)

Bundleデータの取得

// 日本語
if (savedInstanceState != null) // onCreate内でBundleにデータが含まれているか確認できる。データがあれば、Activityが回收されて再作成されたことを意味する
{
    Log.e(TAG, savedInstanceState.getString("user_name"));
}Code language: JavaScript (javascript)

Activityの回收

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です