Category Archives: Android

続・Androidでサービスを作る(落ちないやつ)

前回、Androidでサービスを作る方法を書きましたが、サービスって言うやつは便利で、システムのメッセージを取得できたりします。ですが、所詮アプリケーションとして動くサービスなので、システムによって不意に落とされてしまう事もあります。今回は、【起動時に自動で起動】、【終了されても自動で復活】(強制終了された場合は再帰不能)する方法を書きます。

まず、起動時に自動で起動についてですが、AndroidにはBroadcastReceiverという便利なものがありまして、これがシステムのイベントが起こったときのメッセージを受信してくれます。BroadcastReceiverは、アプリケーションの中に入っていて、インストールさえされてれば動作します。ただ、前回の記事にも書いたように、インストールされて一度も起動されていないサービスは、システムのメッセージを受信できないので注意が必要です。

それでは、起動したいサービスをServiceSample、Android起動時のメッセージを受信するレシーバをBootReceiverとしてコードを書きます。

コードとしてはこれだけ。あとはこれを「レシーバ」として、AndroidManifest.xmlに登録すればOKです。ですが、onReceiveは起動時に限らず、全てのメッセージが発された時に呼び出されるメソッドです。従ってこれだけではどんなメッセージを受け取った際もサービスを起動するようなコードになってしまいます。そのため、AndroidManifest.xmlの中でintent filterをかけます。レシーバの登録と、intent filterの記述は以下のようにします。

これでBOOT_COMPLETEDのメッセージ以外受け付けなくなるので、Android起動時に立ち上がるサービスは出来ました。次に、終了されても自動で復活する処理ですが、これはサービスのonDestroyメソッドに以下のような処理を記述します。

onDestroyメソッドの中で非同期処理でサービスをスタートします。このとき、System.exit(0);を使用して、もとのサービスをしっかり終了してあげないと、2重にサービスが立ち上がってしまう事があるので、注意が必要です。

Androidでサービス(Service)を作る

Androidはあんまり得意じゃなくて初心者だけれども、サービスをこの間作ったのでメモメモ。

そもそもサービスって何だろうって感じだけど、画面を伴ってフォアグラウンドで動くのがActivityで、そうではなくバックグラウンドで動き続けるのがServiceかな?大体出来る事は結構同じみたい。それよりも、アプリを開発する中でサービスってどういう位置づけなのー?ってところからよくわかってなかったけど、とりあえず、サービスをAndroidのプロジェクトに登録しとけばあとは適切なタイミングで動くらしいですね。サービスの登録は、AndroidManifest.xmlに書き込みを行います。ここでは、サービスを実装するファイルを、ServiceSample.javaとしてお話をすすめます。

じゃぁ実際どうやって作るかっていうと、継承するクラスをActivityからServiceに変えるだけ。超簡単。

これだけで、このクラスはサービスとしての振る舞いを行うようになります。これでAndroidにインストールをすれば晴れてサービスのインストール完了です。

…….起動は?

Androidのサービスは簡単に作れて便利なのですが、ちょっとしたクセ(バグ?Android3.x以降)があります。それは、Androidのサービスは一度起動されるまで停止状態(STOP状態)のままになってしまっていて、システムのメッセージ(起動完了:ACTION_BOOT_COMPLETED等)を受け取れないというものです。つまり、インストールが完了しても何らかのアクションが無いと、結局サービスとして起動されないという事ですね。ということで、どこかでサービスを起動してあげましょう。MainActivity(Activityを継承したクラス)からServiceSampleを起動するには次のようにします。

この処理をサービスを起動したいタイミングで書いてあげれば、Activityからのサービスの起動が可能です。