MediaPlayerで再生したファイルをintentで遷移させた先でstopさせる その2


前回の記事で、異なる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"/>
カテゴリー: Android, Eclipse, Java, プログラム

コメントを残す

メールアドレスが公開されることはありません。