前回の続き

まずはProcess(Application Process)について理解しましょう。

Process

多くの人はアプリを終了したらProcessも死ぬ、つまりメモリから消えると考えるのではないでしょうか?Androidでは違います。ここの認識を間違うとAndroid開発では地を這います。結構、大事なことだと思うのですが、あまり言及されていないように思います。大人はいちいち答えたりしないのでしょうか・・・

見た目上アプリを終了してもProcessはメモリに残る

  • アプリを開く
  • 画面遷移を行う、もしくは最初の画面のままでもよい
  • 戻るボタンを押し続けて最初の画面でさらに戻るを押す
  • アプリは閉じられAndroidのホーム画面に戻ってくる

この時、ユーザーはアプリを終了したと認識するでしょう。しかし、Processはまだメモリに生きています。

これが何を意味するかというと

  • static変数は設定した値のまま生き残る
  • Systemプロパティは設定した値のまま生き残る

ということです。

再びアプリのアイコンをタップした時、生き残っていたProcessで最初の画面(Activity)が起動します。このときstaticやSystemプロパティは以前の値のままです。このような仕組みになっているのは、メモリ効率などシステムの都合だと思います。

結局、Processはいつメモリから消えるかというと、

  • 他のアプリがメモリを必要とする
  • 一晩放置する。つまり、しばらくアプリが再起動されそうにない状態が続く

などの要因で消えます。

Processがメモリから消えてもアプリが終了するわけではない

次に理解するべきことは、Processはアプリを起動中でもメモリから消えることがあるということです。

  • アプリAを起動しフォアグラウンドになる
  • アプリBを起動しフォアグラウンドになる。 このとき、アプリAはバックグラウンドになる
  • アプリBがメモリを消費し、システム全体でメモリが足らなくなる。もしくはアプリAをバックグラウンドのままにして長時間放置する
  • システムはバックグラウンドになっているアプリAのProcessをメモリから消す
  • つまりアプリAの全Activity、static変数、Systemプロパティの設定もメモリから消える

要するにProcessがメモリから消えるタイミングは、システムが他に優先してメモリが必要だと判断した時です。ユーザーが外見上アプリを終了した時ではありません。

上記のケースでは、ユーザーはアプリAを終了したつもりはありません。このときホーム画面からアプリAのアイコンをタップするとどうなるでしょう。アプリAは何食わぬ顔で以前の画面を表示します。

この時、何が起きているかというと、

  • アプリAのProcessを再生成する
  • Applicationオブジェクトを再生成する
  • 以前開いていたActivityオブジェクトを再生成して表示す
  • static変数やSystemプロパティは初期値に戻る

このようになります。

注意すべきは以前開いていた画面のActivityのみメモリに復帰し、そのActivityに遷移するまでのActivityはメモリに復帰しないことです。戻るを押して再び画面を開く時に、それらのActivityは都度再生成されます。

このようにProcessがメモリから消えた後も、画面遷移は保持されています。これは誰が管理しているのか?

それはTaskです。

その3へ続く