2021/05/29

[android] Activityの一生

前回、Activityが非表示になるとすぐ onStop()が呼ばれていた。まあ、何も実装していない Activityだったからかもしれないが、Activity がどう動くのか確認しよう。

アクティビティのライフサイクルに関するコンセプト
https://developer.android.com/guide/components/activities/activity-lifecycle#alc

手元に昔購入した Androidの本があるが、ライフサイクルはそのときから変わっていない。この本は APIレベル3 くらいの時代だから、最初から変わっていない、といってしまってもよいのかもしれない。

 

まずは、ライフサイクルに出てくる各メソッド+onRestartにログを埋め込んで見てみる。

2021-05-29 16:28:17.438 D/MainActivity: onCreate
2021-05-29 16:28:17.980 D/MainActivity: onStart
2021-05-29 16:28:17.988 D/MainActivity: onResume

(アプリ一覧)

2021-05-29 16:29:52.977 D/MainActivity: onPause
2021-05-29 16:29:53.811 D/MainActivity: onStop

(自アプリ選択)

2021-05-29 16:30:50.871 D/MainActivity: onRestart
2021-05-29 16:30:50.874 D/MainActivity: onStart
2021-05-29 16:30:50.879 D/MainActivity: onResume

(Home画面)

2021-05-29 16:31:45.120 D/MainActivity: onPause
2021-05-29 16:31:46.072 D/MainActivity: onStop

Home画面に戻してからいろいろアプリを立ち上げたり、1時間ほど放置したりしたのだが onDestroyは呼ばれなかった。アプリ一覧にして上にスワイプして終了させると onDestropyが呼ばれた。

 

Serviceのサンプルアプリでは onStopのタイミングで unbindService()したからそうなったが、別に onDestroyでもよいはずだ。どうせ同じプロセスだし。メモリの残りが少なくなったら、きっと onStopされたアプリは終了させられる候補に入るのだろう。

などということがライフサイクルのところに書いてあるんじゃないのかな?
読むとしよう。


Activityのライフサイクルについては、もう至る所で語り尽くされているに違いない。
だからここではアプリか終了させられるパターンだけに注目しよう。

onDestroy()
https://developer.android.com/guide/components/activities/activity-lifecycle#ondestroy

あれ、onDestroyされるのは 「アクティビティの終了」か「構成の変更によるアクティビティの破棄」しかない。メモリが少なくなったら、という条件がここに書かれていないということは、もっと面倒な話ということか。

 

アクティビティの状態とメモリからの退避
https://developer.android.com/guide/components/activities/activity-lifecycle#asem

ライフサイクルとは別に「プロセスの強制終了」があるのか。うん、あるよな。

表1によると、フォアグラウンドになっていても強制終了される可能性はあることになっている。が、たぶんそれは立ち上げられないほどメモリが無い状態だろうから考慮から外そう。
表の一番下の「破棄」も、まあ忘れていいだろう。プロセスが空だし。

残るは、優先度高の「バックグラウンド(非表示)」と優先度中の「バックグラウンド(フォーカスがない)」だ。 onStop と onPause の違いだろう。
ちなみに英語版だとこういう表になる。 Activity state がメソッド名と同じようになるので、多少わかりやすいか。あんまり変わらんか。

image

いくら翻訳が良くても、やっぱり原文でがしがし読めるようにならないと情報に追いつけないよなぁ、とは思うんだけどね.....

 

ライフサイクルがあるのはわかったとして、動作確認が大変すぎないか? 通常の遷移くらいであればやれば済むのだが、onPauseのときに強制終了、とかやりたかったとしても簡単にできるとは思えん。 onStopならアプリ一覧から終了させればよさそうだけど。

 

アプリのアクティビティをテストする  |  Android デベロッパー  |  Android Developers
https://developer.android.com/guide/components/activities/testing

うーん、ちょっと違うか。
しかしAndroidのテスト方法は知らないので、それはそれで知っておきたいものだ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。