Androidアプリでアクティビティの状態を保存する代替方法
2024-08-28
Androidアプリでアクティビティの状態を保存する方法
saveInstanceState()メソッドの役割
Androidアプリでは、ユーザーがアプリを一時停止したり、画面を回転させたりすると、アクティビティが再作成されます。このとき、アクティビティの現在の状態を保持するために、saveInstanceState()
メソッドを使用します。
- オーバーライドする: アクティビティクラスで
saveInstanceState()
メソッドをオーバーライドします。 - 状態を保存する: メソッド内で、保存したい状態をBundleオブジェクトに保存します。
- 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