Androidアプリでアクティビティの状態を保存する代替方法

2024-08-28

Androidアプリでアクティビティの状態を保存する方法

saveInstanceState()メソッドの役割

Androidアプリでは、ユーザーがアプリを一時停止したり、画面を回転させたりすると、アクティビティが再作成されます。このとき、アクティビティの現在の状態を保持するために、saveInstanceState()メソッドを使用します。

  1. オーバーライドする: アクティビティクラスでsaveInstanceState()メソッドをオーバーライドします。
  2. 状態を保存する: メソッド内で、保存したい状態をBundleオブジェクトに保存します。
  3. Bundleを返す: メソッドの最後に、保存したBundleオブジェクトを返します。

class MyActivity : AppCompatActivity() {

    private var counter = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceStat   e)
        setContentView(R.layout.activity_my)

        //    復元された場合、保存された状態を復元する
        if (savedInstanceState != null) {
            counter = savedInstanceState.getInt("counter")
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(out   State)
        outState.putInt("counter", coun   ter)
    }
}

重要なポイント

  • Bundleの使用: 状態を保存するために、Bundleオブジェクトを使用します。
  • キーの使用: 保存する値にキーを割り当てます。
  • 復元: onCreate()メソッドで保存された状態を復元します。
  • 基本的な状態: アクティビティの基本的な状態(ビューの表示状態、入力値など)を保存することを優先します。
  • 複雑な状態: 複雑な状態を保存する場合は、適切な保存方法(例えば、データベースやファイル)を使用します。

最後に




例1: カウンターの保存

class MyActivity : AppCompatActivity() {

    private var counter = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceStat   e)
        setContentView(R.layout.activity_my)

        //    復元された場合、保存された状態を復元する
        if (savedInstanceState != null) {
            counter = savedInstanceState.getInt("counter")
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(out   State)
        outState.putInt("counter", coun   ter)
    }
}

この例では、カウンターの値を保存しています。

  • onSaveInstanceState()メソッドで、カウンターの値をBundleに保存します。

例2: チェックボックスの状態の保存

class MyActivity : AppCompatActivity() {

    private lateinit var checkBox: CheckBox

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(   savedInstanceState)
        setContentView(R.layout.activity_my)

        ch   eckBox = findViewById(R.id.checkBox)

        // 復元された場合、保存された状態を復元する
        if (savedInstanceState != null) {
            checkBox.isChecked = savedInstanceState.getBoolean("checkBoxChecked")
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putBoolean("checkBoxChecked",    checkBox.isChecked)
    }
}

この例では、チェックボックスの状態を保存しています。

例3: カスタムオブジェクトの保存

``kotlin class MyActivity : AppCompatActivity() {

private var myObject: MyObject? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_   my)

    // 復元された場合、保存された状態を復元する
    if (savedInstanceState != null) {
        myObject = savedInstanceState.getParcelable("myObject")
    }
}

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putParcelable("myObject", myObject)
}

}

class MyObject : Parcelable {

// ... Parcelableの実装

この例では、カスタムオブジェクト`MyObject`を保存しています。

- カスタムオブジェクトは、`Parcelable`インターフェースを実装する必要があります。
- `onCreate()`メソッドで、保存された状態を復元します。
- `onSaveInstanceState()`メソッドで、カスタムオブジェクトをBundleに保存します。

### 重要なポイント
- `Bundle`オブジェクトを使用して状態を保存します。
- キーを使用して値を保存します。
- `onCreate()`メソッドで、保存された状態を復元します。
- 基本的な状態(ビューの表示状態、入力値など)を保存することを優先します。
- 複雑な状態を保存する場合は、適切な保存方法(例えば、データベースやファイル)を使用します。



ViewModelの使用

  • ライフサイクルに依存しない: ViewModelはアクティビティやフラグメントのライフサイクルに依存せず、データの保持と更新を行います。
  • データの共有: ViewModelは複数の

android android-activity application-state

android activity application state