2014年2月8日土曜日

Androidがプロセスを殺す順番

When deciding which processes to kill, the Android system weighs their relative importance to the user.
Processes and Threads

Androidは 殺人鬼 である。
生きている価値がないと(一方的に、偏見をもって)みなされたアプリは
片っ端から殺されてしまう。

一方、Androidは O MO TE NA SHI 上手 でもある。
必要なアプリは丁重に扱われ、少ない、そして限られた、
すごーく貴重な リソースを提供し、
たとえ画面から見えなくなっても紅茶飲み放題は当たり前、
マフィンも食べ放題であるかは電脳世界の中に入ったことがないのでわからない。

概要

なぜ殺されるのだろう。

まず、たいていのアプリは1つのプロセス内で動いている。

Androidはバックグラウンドにまわったプロセスも保持している。
だって一旦別のアプリ使い始めたっていっても、油断ならないじゃん。
またすぐ戻って使うかもしれないじゃん、キミたちは。

でもメモリが少なくなると、んな悠長なこと言っていられないから、
そういうプロセスは終了させてしまう。
これはLow Memory Killerによる挙動だから詳しくはそれでググって。

O MO TE NA SHI。

無差別に殺すわけではなくて、優先順をつけている。
このアンドロイド、一応の理性は有るようだ。

  1. 活きActivity createなService 活きBroadcastReceiver
  2. 中断Activity bindなService
  3. 他のService
  4. Others

だいたいこれ。
優先順が高いほど、殺されにくい。

プロセスを復元せよ。

殺されたプロセスは復元される。
別にLow Memory Killerに殺されたときだけではない。
ランタイムエラーで殺されたプロセスも復元されるんだよ。

そのときActivityは1つだけ復元される。
殺される前、最後に開いていた画面だ。
他のActivityはまだCreateされない。
画面を戻ると順々に復元されていく。

ActivityはActivity.onCreate()の引数として
Activity.onSavedInstanceState()で保存したデータを取得できる。
だからプロセスごと殺されたときに復元できるよう、
十分なデータを保存しておくべきだ。
けどめんどくさいから重要なやつだけでいいよ。
staticな変数とか。

もしくは嘘。

ブログでは メモリ不足だとActivityは死ぬ! と書かれているのを見る。

たしかにActivityは殺される。
しかし、Activityが殺されるのは プロセス が殺されるからだ。

ずーっと同じアプリを使っている限り、
メモリが足りなくなった時に、1つ前のActivityが死んだりはしない。

もしメモリ不足であるActivityが死んだのなら、
そのアプリの他のActivityも死んでいる。