プロセスを強制的にKILL(STOP)してAndroidのライフサイクルを検証

    どうも、伊藤です。

    アプリを起動中にホームボタンを押下して閉じた場合、再度アプリを起動すると同じ画面が表示されたりされなかったり、または強制終了したり、、、という事象に遭遇した事はないですか。
    これは別アプリがメモリを利用しすぎてメモリが逼迫した際に、OS側が強制的に該当アプリのプロセスをKillしたケースに発生します。
    OS側でどうしてもメモリ確保が必要になると必須ではなアプリをKillします。ただ、個人的には必須だと思えるようなプロセスもKillされているように感じます。(LocationManagerServiceとか)

    そして、強制的にプロセスをKillされた場合はActivityのonStopやonDestoryが呼び出されない事があり、ここで挙動がおかしくなる事が多いようです。

    公式文書
    http://developer.android.com/intl/ja/guide/components/activities.html

    if the system must recover memory in an emergency, then onStop() and onDestroy() might not be called. Therefore, you should use onPause() to write crucial persistent data (such as user edits) to storage. However, you should be selective about what information must be retained during onPause(), because any blocking procedures in this method block the transition to the next activity and slow the user experience.

    こういったケースを回避してどういった状況でもホームボタン押下前の状態にするには、任意にデータを保存する必要があります。
    オーソドックスなやり方としては、保存で「onSaveInstanceState(Bundle)」を利用し、読み出しに「onRestoreInstanceState(Bundle)」を利用します。

    利用方法は別の回に書くとして、今回はこのライフサイクルの検証方法を書きます。

    実機で普通に検証している場合、なかなか意図したようにメモリの操作ができず強制的にプロセスをKillする事が難しいです。
    こういう場合、プロセス管理アプリを利用するか、DDMSで強制的にプロセスをKILLしましょう。

    アプリの場合、以下がオススメです。

    【GOタスクマネージャEX】
     見た目もかっこよく、操作性が非常にいいです。
    https://play.google.com/store/apps/details?id=com.gau.go.launcherex.gowidget.taskmanagerex

    0604

    DDMSの場合、以下の画面でプロセスをSTOPしましょう。

    0604_2

    SOTPさせたいアプリのパッケージを選択し、上段にある赤丸のSTOPボタンを押下。

    ではでは。