Androidアプリ開発では、画面回転や言語変更、テーマ変更などの「構成変更」が発生するとActivityやFragmentが再作成されることがあります。その際、通常の変数に保存していたデータは失われてしまうため、画面状態の管理方法が重要になります。
そこで利用されるのがViewModelです。ViewModelは画面のライフサイクルとは異なる仕組みでデータを保持するため、構成変更が発生しても必要な情報を維持しやすくなります。
この記事では、なぜViewModelを使うとデータ保持がしやすくなるのか、ActivityやFragmentとの関係、具体的な利用例を交えて解説します。
Androidの画面回転でデータが消える理由
Androidでは画面回転が発生すると、単純に画面の向きだけが変わるわけではありません。多くの場合、現在表示しているActivityやFragmentが一度破棄され、新しく作り直されます。
例えば、入力フォームにユーザー名を入力している途中でスマートフォンを横向きにすると、Activityが再生成されます。このときActivity内のメンバ変数に保存していた入力内容は初期化されます。
これはAndroidが異なる画面サイズや設定に合わせて適切なリソースを読み込むための仕組みですが、開発者側ではデータを別の方法で管理する必要があります。
ViewModelがデータ保持に向いている理由
ViewModelは、ActivityやFragmentのライフサイクルより長く存在できるオブジェクトです。通常のActivity内の変数とは異なり、構成変更によるActivityの再作成が発生してもViewModelは破棄されません。
そのため、画面表示に必要なデータをViewModelに保存しておくことで、再作成後のActivityやFragmentから同じデータへアクセスできます。
例えば、ユーザーが検索画面で入力したキーワードや取得した一覧データをViewModelに保持しておけば、画面回転後も同じ状態から画面を復元できます。
ActivityやFragmentとViewModelのライフサイクルの違い
データ保持の仕組みを理解するには、ActivityとViewModelの寿命の違いを知ることが重要です。
| 種類 | 構成変更時の動作 |
|---|---|
| Activity | 破棄されて再作成される |
| Fragment | 状態によって再作成される |
| ViewModel | 構成変更では保持される |
Activityは画面表示を担当し、ViewModelは画面に必要なデータや状態を管理する役割を持ちます。この役割分担によって、画面の再生成とデータ保持を分離できます。
ただし、アプリが完全に終了した場合やプロセスが強制終了された場合、ViewModelのデータも失われます。そのような場合にはSavedStateHandleやデータベース、ストレージ保存など別の仕組みが必要になります。
ViewModelを使った具体的なデータ保持例
例えば、商品検索アプリで検索結果一覧を表示する場合を考えます。Activity内だけで検索結果を保持すると、画面回転時に再取得処理が必要になります。
しかしViewModelに検索結果を保存しておけば、Activityが再作成されてもViewModelから以前取得したデータを取得できます。
このようにViewModelは、ネットワーク通信結果、入力内容、選択状態など、画面が一時的に失われても維持したい情報を管理する場所として利用されます。
ViewModelとLiveDataやStateFlowの組み合わせ
現在のAndroid開発では、ViewModel単体ではなくLiveDataやStateFlowなどの状態管理機能と組み合わせて利用することが一般的です。
例えばViewModel内でデータを管理し、LiveDataやStateFlowを通じてActivityやFragmentへ通知することで、データ変更に応じて画面を自動更新できます。
この構造にすると、画面表示を担当するUI側とデータ処理側を分離でき、コードの保守性やテストのしやすさも向上します。
ViewModelで保持できないデータに注意する
ViewModelは非常に便利ですが、すべてのデータ保存に適しているわけではありません。
例えばログイン情報、ユーザー設定、長期間保存したいデータなどはViewModelではなく、暗号化ストレージやデータベースなど適切な保存場所を利用します。
ViewModelはあくまで「画面表示に関連する一時的な状態」を管理するための仕組みと考えると分かりやすくなります。
まとめ|ViewModelは構成変更から画面データを守るための仕組み
Androidで画面回転などの構成変更が発生するとActivityやFragmentは再作成されますが、ViewModelはその影響を受けにくいため、データ保持に利用できます。
画面の状態や取得済みデータをViewModelで管理することで、ユーザーが途中まで操作した内容を自然に維持でき、快適なアプリ体験を提供できます。
ただし、ViewModelは永続保存用ではありません。構成変更への対応にはViewModel、アプリ終了後も残すデータにはデータベースや保存領域を使うなど、用途に応じて使い分けることが重要です。


コメント