前回の記事で、異なる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"/>