Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Android】onSaveInstanceStateでアクティビティの状態を保存・復元する方法

この記事では、onSaveInstanceState() を使って Android アクティビティの状態を保存し、onRestoreInstanceState() で復元する方法を、実際のサンプルコードとともに解説します。

Android では、画面の回転やメモリ不足によるプロセスの強制終了などによって、アクティビティが破棄されて再生成されることがあります。このとき onSaveInstanceState() をオーバーライドして一時的なデータを保存しておけば、再生成後に onRestoreInstanceState() でそのデータを取り出すことができます。

ステップ1:新規プロジェクトを作成する

Android Studio を起動し、メニューから「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成してください。

ステップ2:レイアウトファイルを編集する

res/layout/activity_main.xml に以下のコードを追加します。

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android"
    xmlns:app = "https://schemas.android.com/apk/res-auto"
    xmlns:tools = "https://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:gravity = "center"
    android:layout_height = "match_parent"
    tools:context = ".MainActivity"
    android:orientation = "vertical">
    <TextView
        android:id = "@+id/actionEvent"
        android:textSize = "40sp"
        android:layout_marginTop = "30dp"
        android:layout_width = "wrap_content"
        android:layout_height = "match_parent" />
</LinearLayout>

上記のコードでは、復元されたインスタンスの内容を画面に表示するための TextView を中央に配置しています。

ステップ3:MainActivity.java を編集する

src/MainActivity.java に以下のコードを追加します。

import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView actionEvent;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        actionEvent = findViewById(R.id.actionEvent);
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        savedInstanceState.putString("MyString", "Welcome back to Android");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        String myString = savedInstanceState.getString("MyString");
        actionEvent.setText(myString);
    }
}

このコードのポイントは次のとおりです。

  • onSaveInstanceState():「MyString」というキーを使って文字列「Welcome back to Android」を Bundle に保存します。このメソッドは、アクティビティが破棄される可能性があるタイミングでシステムから呼び出されます。
  • onRestoreInstanceState():アクティビティが再生成された際に、保存しておいた Bundle から同じキーで文字列を取り出し、TextView にセットして表示します。

なお、新しいプロジェクトではサポートライブラリの代わりに AndroidX が標準となっているため、android.support.v7.app.AppCompatActivity の部分は androidx.appcompat.app.AppCompatActivity に置き換えてください。

アプリを実行して動作を確認する

それではアプリを実行してみましょう。実機の Android スマートフォンをパソコンに接続しているものとします。Android Studio でプロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。デバイスとして自分のスマートフォンを選択すると、端末に次のような初期画面が表示されます。

【Android】onSaveInstanceStateでアクティビティの状態を保存・復元する方法

ここで画面を回転させてみてください。アクティビティが一度破棄されて再生成されますが、onSaveInstanceState() で保存したテキストが onRestoreInstanceState() によって復元され、画面に「Welcome back to Android」と表示されます。

このように、保存インスタンス状態(Saved Instance State)を利用すれば、画面回転などの構成変更が発生しても、ユーザーに見せている一時的なデータを失うことなく保持できることが確認できます。

  1. 【Android】アクティビティを再起動する方法をサンプルコード付きで解説

    はじめに このチュートリアルでは、Androidアプリでアクティビティ(Activity)を再起動する方法を解説します。アクティビティの再起動は、finish()で現在のアクティビティを終了し、startActivity()で同じインテントを使って再度起動するという手法で実現できます。 ここでは、ボタンをタップするとランダムな数値が表示し直されるサンプルアプリを作成しながら、具体的な手順を紹介します。 ステップ1:新規プロジェクトの作成 Android Studioを開き、「File」→「New Project」を選択して、必要な情報をすべて入力し、新しいプロジェクトを作成します。 ステッ

  2. 【Android】Intentを使ってアクティビティ間でオブジェクトを送信・受け渡しする方法

    このチュートリアルでは、AndroidのIntent(インテント)を使って、あるアクティビティから別のアクティビティへオブジェクトを送信する方法を解説します。ポイントは、受け渡すカスタムクラスにSerializableインターフェースを実装することです。これにより、送信側はputExtra()でオブジェクトをIntentに格納でき、受信側はgetSerializableExtra()で取り出せるようになります。それでは、手順をステップごとに見ていきましょう。ステップ1:新規プロジェクトを作成するAndroid Studioで新しいプロジェクトを作成します。メニューから「File」→「New P