前回、Androidでサービスを作る方法を書きましたが、サービスって言うやつは便利で、システムのメッセージを取得できたりします。ですが、所詮アプリケーションとして動くサービスなので、システムによって不意に落とされてしまう事もあります。今回は、【起動時に自動で起動】、【終了されても自動で復活】(強制終了された場合は再帰不能)する方法を書きます。
まず、起動時に自動で起動についてですが、AndroidにはBroadcastReceiverという便利なものがありまして、これがシステムのイベントが起こったときのメッセージを受信してくれます。BroadcastReceiverは、アプリケーションの中に入っていて、インストールさえされてれば動作します。ただ、前回の記事にも書いたように、インストールされて一度も起動されていないサービスは、システムのメッセージを受信できないので注意が必要です。
それでは、起動したいサービスをServiceSample、Android起動時のメッセージを受信するレシーバをBootReceiverとしてコードを書きます。
1 2 3 4 5 6 7 8 9 10 11 |
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent service = new Intent(context, ServiceSample.class); context.startService(service); } } |
コードとしてはこれだけ。あとはこれを「レシーバ」として、AndroidManifest.xmlに登録すればOKです。ですが、onReceiveは起動時に限らず、全てのメッセージが発された時に呼び出されるメソッドです。従ってこれだけではどんなメッセージを受け取った際もサービスを起動するようなコードになってしまいます。そのため、AndroidManifest.xmlの中でintent filterをかけます。レシーバの登録と、intent filterの記述は以下のようにします。
1 2 3 4 5 |
<receiver android:name="BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> |
これでBOOT_COMPLETEDのメッセージ以外受け付けなくなるので、Android起動時に立ち上がるサービスは出来ました。次に、終了されても自動で復活する処理ですが、これはサービスのonDestroyメソッドに以下のような処理を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@Override public void onDestroy() { super.onDestroy(); Context context = this; AsyncTask<Context, Void, Void> restartTask = new AsyncTask<Context, Void, Void>(){ @Override protected Void doInBackground(Context... params) { Intent intent = new Intent(params[0], ServiceSample.class); startService(intent); return null; } }; restartTask.execute(context); System.exit(0); } |
onDestroyメソッドの中で非同期処理でサービスをスタートします。このとき、System.exit(0);を使用して、もとのサービスをしっかり終了してあげないと、2重にサービスが立ち上がってしまう事があるので、注意が必要です。