Androidでは、アプリの動作中に**「画面の状態やデバイスの構成が変わる」こと**があります。たとえば:
- 画面の回転(縦 ↔ 横)
- 言語の変更(日本語→英語)
- 画面サイズの変更(マルチウィンドウなど)
これらの「構成の変化」が起こると、Activityは一度破棄され、再生成されるのが基本の挙動です。
■ なぜActivityが再生成されるの?
例えば、画面が縦から横に変わると、UIの配置も変わるかもしれませんよね。
そのためAndroidは「安全のために」一旦Activityを破棄して、必要なレイアウトなどを再読み込みし直すのです。
画面が回転する
↓
Activityの onDestroy() → onCreate() などが呼ばれる
↓
状態を保持していないと、入力していた内容が消えてしまう
■ 何が問題なの?
例えば、ユーザーがフォームに入力していたテキストが、画面回転で消えてしまう!
→ ユーザー体験が悪くなります。
■ 解決策(状況別に使い分け)
【方法①】Bundleを使って状態を保存・復元する
▶ onSaveInstanceState()
と onRestoreInstanceState()
を活用
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("memo", editText.getText().toString());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String memo = savedInstanceState.getString("memo");
editText.setText(memo);
}
→ 一時的な入力データの保存に有効です。
【方法②】ViewModel
+ LiveData
を使う(Jetpack推奨)
- ActivityやFragmentのライフサイクルに関係なく、データを保持できます。
- 特に画面回転してもViewModel内のデータは保持されるので便利。
public class MyViewModel extends ViewModel {
public MutableLiveData<String> memo = new MutableLiveData<>();
}
【方法③】構成変更を自分で処理する(Activityの再生成を抑止)
AndroidManifest.xml に追記:
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize" />
そしてActivity側で:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// 回転後の画面に応じて再レイアウトなどを行う
}
ただしこの方法は公式としては非推奨です(複雑になりがちなので、ViewModelでの管理を優先しましょう)。
■ 補足:よく保持したい情報の例
保持対象 | 手段 |
---|---|
ユーザーが入力中のテキスト | onSaveInstanceState() or ViewModel |
DBやAPIから取得したデータ | ViewModel にキャッシュする |
画像・ファイルなどの一時パス | 一時保存ディレクトリ or ViewModel |
フラグメントの状態 | FragmentManager が自動的に保持してくれる(基本は意識しなくてOK) |
■ まとめ
- **構成変更(Configuration Change)**とは、画面回転や言語変更などでActivityが再生成されること。
- 対応しないと、ユーザーの入力などが消えてしまう。
- 解決方法は3つ:
Bundle
を使って一時保存ViewModel
でデータを保持(推奨)configChanges
で自前管理(上級者向け)