Andoridアプリの設計に関して、今一度
- ActivityとFragment
- Activity Lifecycle
- MVVM設計って?
といったあたりを再確認してみました
ActivityとFragment
Activityは、アプリの画面を表示するためのコンポーネントであり、各Activityにはユーザインタフェースを表示するためのウィンドウが与えられます。一般的にはウィンドウは画面と同じ大きさになりますが、画面より小さくしたり、他のウィンドウ上にフローティングさせたりすることもできます
一方で、Fragmentは、Activityのもつユーザインタフェースや機能の一部を表現するもので、1つのActivityに複数のFragmentを組み合わせてビルドしたり、複数のActivityで1つのFragmentを再利用したりもできます。独立したライフサイクルを持ち、Activityの処理によって追加・削除が可能です
Fragmentの登場
Fragmentはタブレット用に開発されたAndroid3.0から導入されたもので、Fragmentを用いることでタブレットのような大きな画面サイズに対しても、Activityで無理やりユーザインタフェースを変えて複雑な処理を行わずに済むようになりました
ActivityとFragmentの使い分け
以前は、画面のユーザインタフェースやそれを操作するロジックの多くはActivityに集中してしまい、Activityの肥大化、可読性の低下を引き起こしていました
しかし、Fragmentの登場によって、画面ごとのロジックやインタフェースはFragmentに記述できるので、ActivityはFragmentを管理するだけで済むようになり、複数画面の表現も1つのActivityで可能となりました
Fragmentはいわば、Activityを単純化させてくれる優れものだったわけです
Activity Lifecycle
onCreate()
Activityが最初に起動されたときに呼ばれます
レイアウトの作成など、最初に1回だけ実行される初期処理などはここで行います
onStart()
Activityが表示される直前であることを示しています
onCreate()とは異なり、Activityのライフサイクルの中で繰り返し呼ばれる可能性があります
onResume()
Activityがユーザの操作を受け付けるようになる直前で呼ばれます
アプリ内の他のActivityから復帰してきた際にも呼ばれます
onPause()
Activityがバックグラウンドに移行する直前で呼ばれます
アプリ内の他のActivityに遷移する際にも呼ばれます
また、onPause()呼び出し後には、メモリ不足によってプロセスが終了してしまう可能性があるため、onPause()ではアプリの永続化データを保存する必要があります
onStop()
Activityがユーザからまったく見えなくなった後に呼ばれます
メモリ不足でプロセスを終了させられた場合には、呼ばれません
onRestart()
onStop()の後、Activityが再度表示される場合に呼ばれます
ホームボタンなどでアプリがバックグラウンドタスクになり、再びフォアグラウンドタスクになった際に呼ばれます
onDestroy()
Activityが破棄される直前に呼ばれます
メモリ不足でプロセスを終了させられた場合などには、呼ばれない可能性があります
MVVM設計って?
ご存知の通り、よく知られたMVC(Model-View-Controller)の派生形と言われています
- View
- 画面の表示を担い、Activity/Fragmentやxmlが該当します
- ViewModel
- ViewとModel間の情報の伝達、およびViewのための状態保持を役割とします
- プレゼンテーションロジックを表現し、ボタンタップ時の処理などをコマンドとして保持します
- Model
- ドメイン領域を担い、データの操作やビジネスロジックの処理が記述されます
- UIに依存しないロジックを扱います
MVCとの違い
MVCではViewがModelを直接参照していたのに対し、MVVMではViewとModelの間にViewModelという中間層が置かれます
(引用) https://qiita.com/shinkuFencer/items/f2651073fb71416b6cd7
双方向DataBinding
- Viewは常にViewModelの状態を参照し、ViewModelが変更になればViewの表示も変更されます
- また、ViewModelもViewを常に監視し、Viewに何かしらの入力があれば即座にViewModelの状態も変更されます
このようにMVVMは、
DataBindingによってデータそのものを共有して取り扱う考え方なのです