google-code-prettify

2012-11-01

AndroidのActivityのライフサイクルに関して多くの人が誤解している点

AndroidのActivityに関していろいろ調べた。おそらく(私も含めて)多くの人が誤解している点をまとめた。

メモリ不足の時、あるActivityだけが破棄されるという事は無い

システムのメモリが足りなくなったときにはLow Memory Killerが動作するが、Low Memory Killerはprocessの中の、あるActivityだけを破棄するということはせず、process全体をkillする。

メモリ不足により、「あるActivityはonDestroyが呼ばれずに破棄され、他のActivityは生きている」、ということは起こらない。processがkillされたとき以外は、onCreateとonDestroyはセットで呼ばれる。

メモリが足りなくなってprocessがkillされるのをシミュレートするには、単にDDMSでprocessを選択し、STOPボタンを押せば良い。

参考:
https://groups.google.com/forum/#!msg/android-developers/WF-STG7GdrI/QrBL0btjCxYJ

processがkillされても、Activityのスタックの記録は残っている

Low Memory Killerによりprocessがkillされても、Activityのスタックの記録(TaskRecord)は残っている。onSaveInstanceState()で保存したBundleも残っているし、Activityを起動したIntent(=getIntent()で取得できるIntent)も残っている。 

processをkillした(killされた)後に、
$ adb shell dumpsys activity
を実行してみると、Activityのスタックが残っている事を確認できる。

processがkillされた後にそのアプリを起動すると、一番上のActivityのonCreateがsavedInstanceState!=nullで呼ばれる。backボタンを押すと、今度は一つ下のActivityのonCreateがsavedInstanceState!=nullで呼ばれる。

Activityのスタックの記録は、暫くすると無くなる

Activityのスタックの記録は15-30分など、暫くすると無くなるが、Low Memory Killerでプロセスがkillされる事と、Activityスタックの記録が無くなる事は、無関係と考えて良い。 

時間が経ってもActivityのスタックの記録が無くならないようにするには、rootのActivityに android:alwaysRetainTaskState="true"
を指定すればよい。 

参考:
http://stackoverflow.com/questions/7107614/for-how-long-does-android-save-a-killed-activitys-state

0 件のコメント: