Activityのライフサイクル onCreate() onResume() onPause() の構造でつくろう。
// 注意 onActivityResult→onResumeの順で実行
Activityのライフサイクル
画面回転時、Activityはライフサイクルに従い、一度onStopを経由しonDestroyされます。回転後、onCreateから画面を再構築します。
ということは、onresume で画面のテキストビューを更新させても、回転したら、
初期値になってしまうということ。
Activityのライフサイクル
androidアプリでは、Activityのライフサイクルを考慮しなければなりません。以下のサイトが参考になります。
また、次のサイトは何をするべきか、わかりやすく説明されています。
このサイトによると、onCreate(), onResume(), onPause()がアプリケーションとして重要であり、なすべきことがある。
それ以外のコールバックは、あまり意味を持たないとある。
また、android開発ガイドのActivityの部分は一読しておくべきと考えます。
日本語訳はここにあります。
アプリの一生において、いくつかの事象が生じる。その時、Activityでは以下のコールバックが発生する。
コールバックメソッド |
|
onCreate() | Activityが生成された最初の1回だけ呼び出される |
onStart() | Activityが画面に表示されるときに呼び出される |
onRestart() | ActivityがonStop()の後、復活するときに呼び出される。 このあと、onStart()が呼び出される。 |
onResume() | Activityが前面になる時に呼び出される。 |
onPause() | Activityがバックグラウンドに移動するときに呼び出される。 |
onStop() | Activityが画面から見えなくなる時に呼び出される。 |
onDestroy() | Activityが終わる時に呼び出される。 |
これらのイベントにより3種類のライフタイムが表現される。
entire lifetime
onCreate()で始まり、onDestroy()で終わる。
バックグラウンドで動くスレッドを使っている場合、onDestroy()で確実に止めること、とある。
visible lifetime
onStart()で始まり、onStop()で終わる。
この間、ユーザーに表示するリソースを管理せよ、とある。
foreground lifetime
onResume()で始まり、onPause()で終わる。
この切り替えは頻繁に起こるので、重い処理をしてはいけない、とある。
通常、アプリでは次のような処理を行います。
Activityを作ったとき
・画面を生成する。
・DBあるいはファイルから情報を取り出す。
・画面に情報を表示する。
Activityが閉じるとき
・情報を保管する
これらの処理をどのイベントで実施するべきかを検討します。
1.onCreate(重要)
Activityが最初に起動するときに呼び出される。画面インターフェースの作成や、1度しか行わない最初の初期化処理を記述する。画面回りに関しては、作成するだけで、まだ触ってはいけない。
2.onStart
Activityが表示される前に呼ばれる。
Activityの遷移で元に戻ったときにも呼び出される。(これは忘れやすい)
3.onResume(重要)
Activityが前面にきて、ユーザーとのやりとりを始められるようになる直前に呼び出される。
データベースを利用する場合は、ここでデーkouzou タベースに接続する。
ここで行うべき処理は、
・データベースに接続する。
・データベース等から必要な情報を取り出す。
・画面に情報を表示する。
4.onPause(重要)
他のアプリが前面にきて、Activityがバックグラウンドに隠れるときに、呼ばれる。
まだ完全に見えなくなったわけではない。見えなくなると、onStop()が呼び出される。
このコールバックの後には、OSによりkillされる可能性がある。
開発ガイドには、ユーザーがこのActivity上で実施したデータ変更は、このタイミングで保存(コミット)しろ、とある。
Activityが持つ情報をファイルやデータベースに保存する処理はここで行うべきとある。
データベースに関しては、以下の処理が必要なようだ。
・必要な情報を保存する。
・データベース接続を解放する。
onPauseでデータベース接続を解放するということは、
onResumeでデータベースに接続する必要がある。
つまり、アプリを通じてデータベースをオープンしっぱなしなのはまずい。
各ActivityのonResume()でデータベースをオープンし、
onPause()でクローズするという扱いが必要になる。
ということは、DBアクセサ等をシングルトンにする意味があまりないか?
各Activityは、独立して、閉じたつくりにする必要があると思われる。
5.onStop
ホーム画面に戻ったり、アプリが見えなくなるときに呼ばれる。
このあと、システムの状態(メモリ不足等)によっては、OSによりActivityが殺される可能性もある。
そのため、いつアプリが停止してもよい状態にしておく必要がある。
ただし、onStop()が呼ばれずに、プロセスがkillされる場合がある。
重要の情報の保管場所としては不適切。
6.onRestart
終了状態になったActivityが再開するときに呼び出される。このあと、onStart()が呼ばれる。
7.onDestroy
Activityが破棄される直前に呼ばれる。