ノーティフィケーションからのアクティビティ起動
最後に、通知ドロワーからアクティビティを起動するように改造しましょう。
現状、再生ボタンを押した後、つまりメディアの再生がバックグラウンドで開始された後にアクティビティを終了させてしまうと、メディア再生の停止、つまり、サービスの停止が行えません。そこで、サービス開始と同時に通知を表示し、通知ドロワーをタップすると、再度アクティビティが起動するように改造します。
PlayerPreparedListenerのonPrepared()メソッドに以下の内容を追記してください。
public void onPrepared(MediaPlayer mp) { mp.start(); // (1) NotificationCompat.Builder builder = new NotificationCompat.Builder(SoundManageService.this); // (2) builder.setSmallIcon(android.R.drawable.ic_dialog_info); // (2) builder.setContentTitle("再生開始"); // (2) builder.setContentText("音声ファイルの再生を開始しました"); // (2) Intent intent = new Intent(SoundManageService.this, SoundStartActivity.class); // (3) intent.putExtra("fromNotification", true); // (3) PendingIntent stopServiceIntent = PendingIntent.getActivity(SoundManageService.this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); // (4) builder.setContentIntent(stopServiceIntent); // (5) builder.setAutoCancel(true); // (6) Notification notification = builder.build(); // (7) NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // (7) manager.notify(1, notification); // (7) }
(1)はもともと記述されていたものです。
(2)と(7)はonCompletion()に記述したリスト7とほぼ同じです。違うのは、表示文面とnorify()の第1引数だけです。
(3)~(6)が新たに追加された処理です。通知ドロワーをタップしてアクティビティを起動させるには、(5)のように、BuilderのsetContentIntent()メソッドを使います。
引数としてはPendingIntentオブジェクトを渡します。PendingIntentというのは指定されたタイミングで使用されるインテントと理解して問題ありません。PendingIntentオブジェクトでActivityの起動をつかさどるものを生成するには、PendingIntentクラスのstaticメソッドであるgetActivity()を利用します。
引数は4個あり、第1引数はコンテキストです。
第2引数は、複数の画面部品からこのPendingIntentを利用する際に、それらを区別するための数字です。今回は複数部品からの利用はありませんので、0にしています。
第3引数が起動先Activityクラスを指定した通常のIntentオブジェクトです。このオブジェクトを生成している処理が(3)です。今回は、さらにputExtra()でデータの引き継ぎを行っています。このデータの利用法は後述します。
第4引数は、すでにOS内に同じ種類のPendingIntentオブジェクトが残っている場合にどのような処理をするかの設定です。これはPendingIntentクラスの定数で指定し、今回は、FLAG_CANCEL_CURRENTを指定しています。これは、残っているオブジェクトを破棄し、新しいのと置き換える処理を指定しています。ノーティフィケーションでPendingIntentを使用する場合は、この定数を指定したほうがいいでしょう。
これら、(3)~(5)の処理で、通知ドロワーをタップすることで、SoundStartActivity画面が再表示されます。その際、タップされた通知メッセージを自動的に消去するように設定しているのが(6)です。
最後に、通知メッセージ経由でSoundStartActivity画面が表示された場合、再生ボタンを使用不可して停止ボタンが使用可能になるように、SoundStartActivityのonCreate()メソッドに以下のコードを追記してください。
protected void onCreate(Bundle savedInstanceState) { ~省略~ Intent intent = getIntent(); boolean fromNotification = intent.getBooleanExtra("fromNotification", false); // (1) if(fromNotification) { Button btPlay = (Button) findViewById(R.id.btPlay); Button btStop = (Button) findViewById(R.id.btStop); btPlay.setEnabled(false); btStop.setEnabled(true); } }
特に説明の必要はないでしょうが、ノーティフィケーションからの経由か通常の起動かを分岐するために、Intentオブジェクトから引き継ぎデータを取得しているのが(1)です。このために、リスト8の(3)でputExtra()を行っています。
これで、コーディングは終了です。アプリを再起動し、再生を行ってください。通知が表示されていることが確認できるでしょう。その上で、再生中にアクティビティを終了し、通知ドロワーからメッセージをタップしてください。再度アクティビティが起動し、停止ボタンが機能することが確認できるでしょう。
まとめ
今回は、サービスとノーティフィケーションを解説しました。次回はマップアプリなどOSがもともと用意しているアプリとの連携を扱います。同時に、GPS機能の利用法も扱います。