2014年8月29日金曜日

【Android】「ホームボタンが押されてアプリがバックグラウンドに移ったとき」を検知するActivity.onUserLeaveHint()

Androidでは、アクティビティやフラグメントのライフサイクルを意識して処理の順番や初期化のタイミングなんかを整理しないといけない。

非同期処理やAPI接続など、複雑で長い処理(「一連の処理」のつながりが長い処理)は、途中で中断される可能性にも対応しなくてはならない。


「長い処理がどこまで進んだのか」を保持しておいて、再開時に続きから実行する、という処理が難しい場合、そもそも処理を初めからやり直させるほうが確実だしエラーが少ない。時間はかかるけど。

しかし、ユーザーが端末のHOMEボタンを押してHOME画面に遷移したとしても、アプリにとってはそれは「完全終了」扱いにならない。

通常だと、アクティビティもフラグメントも、ライフサイクル上のもっと短いサイクルを回るだけである。
HOMEボタンを押す→onPause()を通る
HOME画面から再度アプリに戻ってくる→onResume()を通る

そこで、「この処理が終わってない状態の時、HOMEボタンが押されたらきちんとアプリそのものを終了させて、再開時はライフサイクルの頭から再びきちんと処理をやり直させる」という仕組みがほしい。

Activityクラスには onUserLeaveHint() というメソッドがある。これはHOMEボタンを押すなど、「ユーザーの操作でアプリがバックグラウンドに移るときに呼ばれる」処理だということ。

http://developer.android.com/reference/android/app/Activity.html#onUserLeaveHint%28%29

Called as part of the activity lifecycle when an activity is about to go into the background as the result of user choice.
意訳:ユーザーの選択によってアクティビティがバックグラウンドに移る時、アクティビティのライフサイクルの一環として呼ばれる。

なので、該当アクティビティのonUserLeaveHint() メソッドに finish() を書いておけば、HOMEボタンが押された時に完全に終了させることができるようになる。
その処理は条件付きで行いたいという場合、プリファレンスなどを使って条件を参照できるようにしておき、「これこれの時に限っては、HOMEボタン押したらアプリの終了とするからね」という処理にするといい。

Activity.finish()は、アプリをキレイに終わらせるメソッドで、該当のアクティビティとそれに連動しているフラグメントたちはそれぞれきちんとonDestroy() まで通って終了してくれるようだ。

参考:
http://blog.livedoor.jp/tattyamm/archives/3640900.html

そうか、戻るボタンの挙動にも対応しないといけないのか…

0 件のコメント:

コメントを投稿