メモリ不足の時、ある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 件のコメント:
コメントを投稿