前回の記事で、異なるActivity間で共通のMediaPlayerインスタンスを使い、別の画面で再生開始した音声を、また別の画面で停止するという方法を書きました。
今回の記事はさらに発展させて、BroadcastReceiverで再生させたMediaPlayerを、遷移した先のActivityで停止させるというものです。
前回はActivityどうしだったので、同じ型を継承することができました。しかし今回はBroadcastReceiverとActivityを継承しなくてはいけません。複数の異なる型を継承することも可能ですが、非常にややこしいので、今回は別のやり方で。
(普通にBroadcastReceiverで再生するだけなら、こちらの記事をご参照ください)
[AlarmReceiver]
public class AlarmReceiver extends BroadcastReceiver { // notifications @Override public void onReceive(Context context, Intent data) { Resources res = context.getResources(); Notification n = new Notification(); //アイコンの設定 n.icon = R.drawable.ic_launcher; //メッセージの設定 n.tickerText = "メッセージ1"; //通知を選択した時に自動的に通知が消えるための設定 n.flags = Notification.FLAG_AUTO_CANCEL; // 通知をタッチしたときに起動するActivity Intent i = new Intent(context, StopActivity.class); PendingIntent pi = PendingIntent.getActivity(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); // 上から通知バーを下してきたときに表示される文章をセット n.setLatestEventInfo(context, res.getString(R.string.app_name), "メッセージ2", pi); //デフォルトLED点滅パターンを設定 n.defaults |= Notification.DEFAULT_LIGHTS; // 設定したNotificationを通知する NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(1, n); //MediaPlayerを動作させるためにサービスを起動する Intent serviceIntent = new Intent(context, MyService.class); context.startService(serviceIntent); } }
BroadcastReceiver内では再生しません。
↓の記述で、サービスを生成します。
サービスは、バックグラウンドで動作するので、ライフサイクルがあります。そのあたりは他の記事で詳しく調べてみてください
。
//MediaPlayerを動作させるためにサービスを起動する Intent serviceIntent = new Intent(context, MyService.class); context.startService(serviceIntent);
[MyService]の中身。
自動で60秒ループ再生したら停止するようにしています。
また、サービスが破棄されたときにもちゃんと停止するように、onDestroy()の中にもstopメソッドを書いておきます。
public class MyService extends Service { final static String TAG = "MyService"; MediaPlayer mp; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Log.d(TAG, "onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand"); // アラームを再生 Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.alarm); mp = MediaPlayer.create(this, uri); mp.setLooping(true); mp.start(); int timeout = 60 * 1000; Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { if (mp.isPlaying()) { mp.stop(); } } }, timeout); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); if (mp.isPlaying()) { mp.stop(); } Log.d(TAG, "onDestroy"); } }
あとは、遷移した先のActivityで、↓の記述を書けいてください。
サービスが破棄されるので、アラームは停止します。
[StopActivity]
// MediaPlayerを停止させる stopService(new Intent(getApplicationContext(), MyService.class));
忘れないように、マニフェストファイルにサービスを追加しておきましょう。
[AndroidManifest.xml]
<service android:name="○○○(プロジェクト名).MyService"/>
コメントを残す