サービスとNotification
サービスは、bindServiceメソッドで接続を確立して、unbindServiceメソッドで接続を解除する事もできますが、 ここではstartServiceメソッドでサービスを起動して、 stopServiceメソッドを使って停止する方法についてのみとりあげます。
Notification
サービスはバックグラウンドで動作しているので、ユーザにサービスが動作している事をアクティビティのように表示して示すことができません。
そのかわりに「 Status Bar Notification」 を用いると、ユーザにサービスが背後で動作している事を通知(Notification)する事ができます。
サービスに入る前に、ステータスバーノティフィケーションについてみていきます。
以下に、Notificationのプログラムの例を示します。
Notification(NotificationSample.java)
このプログラムを実行して「notify」ボタンを押すと、プログラムが終了し 下図のようにステータスバーにアイコンと、短い時間、プログラムの37行目のtickerText変数に指定した「Hello」の文字が表示されます。
このアイコンを下にドラッグするか、MENUボタンを押して表示されるメニューより「通知」を選択すると、 下図の画面が表示されます。
ここで「My notification」の表示をクリックすると、再度アクティビティが起動されます。
表示されたアクティビティの「cancel」ボタンを押すと、「ノティフィケーション」の表示を終了させることができます。
この機能は、バックグラウンドで動作するサービスがユーザと対話するのに便利です。
プログラムをみていきます。
ステータスバーにNotificationを表示するには、まず、NotificationManager の参照を取得します(32,33行目)。
アイコンとティッカー文字列(Notification表示開始時に短い時間だけ表示される文字列) と通知時間を指定して、Notificationオブジェクトを作成します。(36~41行目)
「My notification」の表示がクリックされた時に起動されるコンポーネントを指定するための、インテントオブジェクトを作成します。(47,48行目)
PendingIntentクラスの静的メソッドgetActivityを実行して、PendingIntentオブジェクトを取得します。(49,50行目)
Pendingは「保留中の」という意味ですから、PendingIntentオブジェクトはまさしく、Notificationにより起動される予定の、保留中のインテントを指す事になります。
PendingIntentクラスには、getActivityメソッドの他にもgetServiceやgetBroadcastメソッドがあり、 アクティビティ以外のコンポーネントを起動するためのPendingIntentオブジェクトを取得する事もできます。
PendingIntentオブジェクトは、AlarmManagerを使って指定した時間にコンポーネントを起動する時にも使います。
setLatestEventInfoメソッドで、Notificationオブジェクトに通知イベントの内容を設定します。(52,53行目)
setLatestEventInfoメソッドの引数として指定された文字列がどのように表示されるかは、上の画面を参照すればわかると思います。
notifyメソッドにより、Notificationを表示します。(56行目)
notifyメソッドの最初の引数は、Notificationの識別子で69行目のcancelメソッドのように、どのNotificationをキャンセルするかを指定する時に使います。
すべてのNotificationをキャンセルするには、 cancelAllメソッドを使います。
音楽ファイルを再生するサービスプログラムの例
サービスを使って、音楽ファイルをバックグラウンドで再生するプログラムの例を示します。
このプログラムは、単独で起動すると表示されるアクティビティクラスServiceTargetと、 バクグラウンドで動作するサービスクラスMusicServiceで構成されています。
このプログラムでは、音楽ファイルの再生が終了するまでステータスバーにNotificationが表示されます。
アクティビティクラスServiceTargetは、NotificationのPendingIntentに指定されていて、Notificationが選択された時にも呼び出されます。
サービスプログラム1(1)-アクティビティクラス(ServiceTarget.java)
サービスプログラム1(2)-サービスクラス(MusicService.java)
アプリケーションがサービスクラスを認識するためには、 マニフェストファイル(AndroidManifest.xml )へのコンポーネントの登録が必要です。
インテントフィルタにアクションを設定して、アクションを指定してサービスを起動できるようにも設定しています。
サービスプログラム1(3)-サービスクラスマニフェストファイル(AndroidManifest.xml)
このプログラムを実行するには、音楽ファイルも必要です。
ここでは、音楽ファイルとして「res/raw/holiday.mp3」を指定しています。
サービスプログラム(2)の26行目でファイル「holiday.mp3」を指定しているので、ここを実際の音楽ファイルにあわせて下さい。
このプログラムを実行すると、ServiceTargetアクティビティが起動し、以下の画面が表示されます。
「Service Start」ボタンを押すと、音楽ファイルの再生を開始して、ステータスバーにNotificationが表示された後、アクティビティは終了します。
アクティビティが終了しても、サービスは生き続け音楽の再生を続けます。
音楽ファイルの再生が終了すると、自動的にNotificationアイコンは消えます。
Notificationアイコンをドラッグすると、以下のようなNotification画面が表示されます。
「MusicService」の文字をクリックすると、再度アクテlビティが起動されます。
ここで、「Service Stop」ボタンを押すと、音楽ファイルの再生を終了して、ステータスバーのNotificationアイコンが表示されなくなります。
「サービスプログラム1」のコードを説明します。
「Service Start」ボタンが押されると、サービスプログラム1(1)の26~27行目のコードにより サービスクラスを起動するためのインテントオブジェクトが作成され、 28行目のstartServiceメソッドによりMusicServiceクラスのサービスが起動した後、finishメソッドによりアクティビティを終了させます。
サービスが起動すると、MusicServiceクラスのonCreateメソッド(サービスプログラム1(2)の24行目)が実行されます。
これは、 サービスのライフサイクルによるものです。
サービスのライフサイクルについてはAndroid Developersの記事を参照して下さい。onCreateメソッドでは、MediaPlayerオブジェクトを作成しています。(26行目)
また、音楽の再生が終了した時にstopSelfメソッドを実行してサービスを終了するように、MediaPlayerオブジェクトのイベントリスナーを設定しています。(27~33行目)onCreateメソッドの後に、40行目のonStartメソッドが実行されます。
onStartメソッドでは、 NotificationによりServiceTargetアクティビティが起動されるようにPendingIntentオブジェクトを設定して Notificationを表示した後(42~50行目)、音楽の再生を実行しています。
サービスプログラム1(1)の「Service Stop」ボタンの処理(39~41行目)では、 stopServiceメソッドによりMusicServiceのサービスを停止させます。
stopServiceメソッドが実行されると、サービスクラスのonDestroyメソッド(サービスプログラム1(2)の61行目)が実行され、Notificationをキャンセルして MediaPlayerオブジェクトを終了させます。
サービスプログラム1(2)の19行目のonBindメソッドは、 Serviceクラスでabstractとして定義されているのでオーバライトしていますが、 bindServiceメソッドは使わないので、何もせずにただnullを返しています。
他のアプリケーションよりサービスを呼び出す。
アクティビティと同様に、インテントを使って他のアプリケーションよりサービスを呼び出す事ができます。
そのプログラムの例を以下に示します。
サービスプログラム2(ServiceUser.java)
「Service Start(暗黙的)」ボタンの処理は暗黙的なサービスの呼び出しの例です。
「Service Start(明示的)」ボタンの処理は明示的なサービスの呼び出しの例です。
「Service Stop(暗黙的)」ボタンの処理はstopServiceメソッドの例です。
もちろん、明示的な呼び出しでもstopServiceメソッドを実行する事ができます。
プログラムの処理はほとんど「ServiceTarget.java」と同じです。
実行中のサービスをリストアップ
次のようなプログラムを使うと、どのようなサービスが動いているかのリストを取得できます。
サービスプログラム3(ServiceList.java)
MusicServiceを起動した状態で、このプログラムを実行すると以下のように表示されます。
ActivityManager.RunningServiceInfoクラスから他にもいろいろな情報を取得する事ができます。
参考URL
- Android Developers