minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

コンポーネントは Intent へ応答することでインスタンス化が始まり
そのインスタンスの破棄で Life Cycle が終了します。

Activity

http://developer.android.com/images/activity_lifecycle.png

Activity は基本的に以下の3つの状態を取ります。

後述しますが、それぞれの状態によってこの Activity を実行しているLinuxプロセスの重要度は変わってきます。
重要度によっては、プロセスが強制終了されやすくなります。
Pause / Stop の Activity をメモリから削除したい場合、Activity の finish() メソッドを明示的に呼び出します。

Activity でオーバーライドできるフックを以下に挙げます。

インスタンス関連フック

onCreate()

Activity がインスタンス化された後、最初に呼び出されるメソッドです。
ここで、状態の初期設定を行います。
onSaveInstanceState() メソッドを実装している場合、直前の設定値が savedInstanceState 引数として渡されます。

onDestroy()

インスタンスが破棄される直前に呼び出されるメソッドです。
ここで、残っていたリソース(ネットワーク接続など)を全て開放します。

可視関連フック

onStart()

Activity が画面上で見えるようになる直前に呼び出されるメソッドです。
ここで、UI に関する初期処理を行います。

onStop()

Activity が画面上から(完全に)見えなくなったときに呼び出されるメソッドです。
ここで、UI に関する終了処理を行います。

onRestart()

onStop() 後に再びその Activity が可視状態になるとき、onStart() の直前に呼び出されるメソッドです。
必ず onRestart() -> onStart() の順で呼び出されます。

フォアグラウンド関連フック

onResume()

Activity がフォアグラウンドになった直後に呼び出されるメソッドです。

onPause()

Activity がフォアグラウンドから離れるときに呼び出されるメソッドです。
つまり、システムが別の Activity を開始しようとしたときに呼び出されます。
ここでは一般的に、保存していないデータをコミットする処理などが記述されます。

通常、onPause() と onResume() は頻繁に呼び出されます。
よって、これらのメソッドの処理はできるだけ軽量化しておく必要があります。

Process の強制終了

システムは、onPause() や onStop() の処理が終わった後、
いつでもその Process を強制的に終了させることができます。

つまり、onStop() と onDestroy() は、呼び出されない可能性があります。
プロセスが破棄される前に確実に実行させたい処理は onPause() に記述する必要があります。

一時的な値の保存

Activity が強制終了させられたときのために、一時的な値の保存をすることができます。

これはエディタなどで一定時間おきに自動保存する機能に似ています。
違うのは、自動保存されるタイミングは時間ではなく、リソースの空き状況が少ないときなど
「Activity が破棄されやすい状態になったとき」だということでしょうか。

この機能を有効にするには、Activity に onSaveInstanceState() メソッドを実装します。
ここで Bundle に値を格納しておくと、次にこの Activity が起動したときにその値が
onCreate() の引数として渡されます。

自動保存機能は、必ず呼び出されるわけではありません。
ですから、確実に保存したいデータには使わないで下さい。
あくまで不慮にプロセスが破棄されてしまった時の保険くらいに考えて使って下さい。

Service

http://developer.android.com/images/service_lifecycle.png

Service には二つの使用方法があります。

Service でオーバーライドできるフックを以下に挙げます。

インスタンス関連フック

onCreate()

Service がインスタンス化された後、最初に呼び出されるメソッドです。
ここで、状態の初期設定を行います。

onDestroy()

インスタンスが破棄される直前に呼び出されるメソッドです。
ここで、残っていたリソース(ネットワーク接続など)を全て開放します。

アクティブ関連フック

onStart()

Service が開始する直前に呼び出されるメソッドです。
このメソッドには、startService() に渡された Intent オブジェクトが渡されます。
※ onStop() に対応するメソッドはありません

Context.bindService() でサービスした場合、このメソッドは呼び出されません。

onBind()

Context.bindService() でサービスした場合は、onStart() の代わりにこのメソッドが呼び出されます。
このメソッドにも、bindService() に渡された Intent オブジェクトが渡されます。

onUnbind()

unbindService() でサービスを切断したときに呼び出されるメソッドです。
このメソッドには、unbindService() に渡された Intent オブジェクトが渡されます。

onRebind()

onUnbind() によってサービスを切断した後、サービスに新しいクライアントが接続した場合に
呼び出されるメソッドです。
※ Activity とは違い、onRebind() の後に onBind() は呼び出されません

Broadcast Receiver

onRecieve()

Broadcast Receiver が持つ唯一のコールバックメソッドです。
このメソッドの実行中のみアクティブとなり、このメソッドを終了するとアクティブでなくなります。

あるプロセス内で一つでもアクティブになっている Receiver があるとき、
このプロセスは 強制終了しないよう保護されます

しかし、onReceive の中でスレッドを作成してその中で処理を行うようにした場合は
onReceive の実行はすぐに終わってしまうため、プロセスが強制終了してしまう危険性があります。
※ スレッド内処理の実行が完了するまでは待ってくれない

これを回避するには、スレッドではなくサービスで処理を行うようにします。
こうすれば、そのプロセスの重要度はサービスの処理が完了するまで高いまま維持されます。

プロセスの重要度

Android は、プロセスをできるだけ長い間維持しようとしますが、メモリが不足したときには
いずれかの古いプロセスを削除しなければいけません。
Android は、どのプロセスを削除するか決めるために、各プロセスの「重要度」を決定します。

  1. フォアグラウンドプロセス

    最も重要度の高いプロセスで、
    ユーザがその時点で行っている作業に必要なプロセスです。
    以下のいずれかの条件を満たしているプロセスは、フォアグラウンドプロセスと見なされます。

  2. 可視プロセス

    フォアグラウンドでないものの、ユーザに見えている画面に影響を及ぼす可能性のあるプロセスです。
    以下のいずれかの条件を満たしているプロセスは、可視プロセスと見なされます。

  3. サービスプロセス

    startService() で開始されたサービスを実行しているが、
    上の二つの重要度に該当しないプロセスです。

  4. バックグラウンドプロセス

    ユーザから完全に見えていない Activity を保持しているプロセスです。

  5. 空プロセス

    アクティブなコンポーネントを保持していないプロセスです。
    このようなプロセスは、これをキャッシュとして利用し次回のコンポーネント起動時間を
    短縮する目的でのみ使われます。

複数の重要度

例えばあるプロセスが、可視プロセスとサービスプロセスの両方に該当する場合
そのプロセスはより重要度の高い可視プロセスだと見なされます。

プロセス間の依存関係

あるプロセスが別のプロセスに依存している場合、そのプロセスは
別のプロセスより常に重要度が高いと見なされます。

サービスプロセス

上で既に説明したサービスプロセスについて補足します。

このプロセスは、バックグラウンドプロセスよりも重要度が高くなります。
従って、重要度を高くしたいプロセスはスレッドによる処理よりも
サービスによる処理をした方が、削除される可能性が低くなります。

さらに Bind を使ってサービスを利用することで、より高い重要度にすることができます。