1

通知で 3 つのアクション ボタンを使用してメディア サービスを制御したいのですが、コードの動作例を見つけるのが困難です。Vogella にはチュートリアルがありますが、彼は単一のボタンを使用し、サービスではなくアクティビティを開きます。この種の他のチュートリアルと例をいくつか見つけましたが、サービスと複数のアクションのインテントの構築を示す同様のチュートリアルを持つ 3 つの動作するアクション ボタンを備えたものはありません。また、stackoverflow でのアクション ボタンの使用法の最新の例は、いずれも下位に適用できます。 Android のバージョン、シングル インテント ボタンの使用、...

通知を設定するために使用することを考えているコードは次のとおりです。

//individual intents for each action???
Intent Back = new Intent(this, MusicService.class );
Back.putExtras("back", 1);
Back.putExtras("play", 0);
Back.putExtras("next", 0);

Intent Play = new Intent (this, MusicService.class);
Back.putExtras("back", 0);
Back.putExtras("play", 1);
Back.putExtras("next", 0);

Intent Next = new Intent (this, MusicService.class);
Next.putExtras("back", 0);
Next.putExtras("play", 0);
Next.putExtras("next", 1);


//do I need to make three pending intents????
PendingIntent pIntentback = PendingIntent.getService(this, 0, Back, 0);
PendingIntent pIntentplay = PendingIntent.getService(this, 0, Play, 0)
PendingIntent pIntentnext = PendingIntent.getService(this, 0, Next, 0)


Notification noti = new Notification.Builder(this)
.setContentTitle("Juke Box Hero")
.setContentText("Playing ")
.setSmallIcon(R.drawable.ic_launcher)
.addAction(R.drawable.back, "", pIntentback)
.addAction(R.drawable.play, "", pIntentplay)
.addAction(R.drawable.next, "", pIntentnext)
.build();

NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

noti.flags = Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, noti);

ここでいくつか質問があります...

1)上記のコードは、アクションボタン、インテント、および保留中のインテントを設定する方法ですか?

2) サービス内の保留中のインテントによってラップされたインテントを受け取りたいので、getActivity の代わりに getService を呼び出すのは正しいですか?

3) MusicService クラスでインテントを直接受信できる場合、サービスを再起動せずにサービスでインテントを受信するにはどうすればよいですか (したがって、既にメモリに保存されているデータは失われます)。

4) または、BroadcastReceiver クラスを拡張してマニフェストに登録し、対応するインテントを MusicService クラスに送信するレシーバー クラスを作成する必要がありますか?

私は喜んでコードを調べて書くことを理解してください--そして質問する前に数日間それを行ってきましたが、これらの質問に対する簡単な回答が必要です...

ヘルプと指示は大歓迎です

4

1 に答える 1

1

1)上記のコードは、アクションボタン、インテント、および保留中のインテントを設定する方法ですか?

回答 #1) いいえ、適切なアクティビティまたはサービスを起動してアクティブ化する保留中のインテントを設定するには、インテントに setAction(ここにアクション名を挿入) が必要であり、対応する保留中のインテントは保留中のインテントで現在の更新フラグを使用する必要があります(以下の番号 2 への回答のコード例を参照してください)

インテントは次のようになります...

Intent Play = new Intent (this, Receiver.class);
Play.setAction("Play");
Play.putExtra("back", 0);
Play.putExtra("play", 1);
Play.putExtra("next", 0);

2) サービス内の保留中のインテントによってラップされたインテントを受け取りたいので、getActivity の代わりに getService を呼び出すのは正しいですか?

回答 #2) いいえ、broadcastreciever クラスを使用して、通知から送信されたインテントをキャッチしました。getBroadcast を使用して、アプリケーション コンテキスト (必要ない可能性もありますが、良いアイデアのように思えます) が次の方法でアタッチされていることを確認する必要がありました。

PendingIntent pIntentback = PendingIntent.getBroadcast(this.getApplicationContext(), 0, Play, PendingIntent.FLAG_UPDATE_CURRENT);

3) MusicService クラスでインテントを直接受信できる場合、サービスを再起動せずにサービスでインテントを受信するにはどうすればよいですか (したがって、既にメモリに保存されているデータは失われます)。

回答 #3) 私はこの質問を避けましたが、アイデアについて少し調査した結果、この状況を処理するためにサービス クラス内にレシーバーを構築できるようです...現時点では、効果としかし、私が使用した外部ブロードキャスト レシーバー システムは、音楽サービスを中断したり、元のサービス インテントを介して既に渡された情報をリセットしたりしません...

4) または、BroadcastReceiver クラスを拡張してマニフェストに登録し、対応するインテントを MusicService クラスに送信するレシーバー クラスを作成する必要がありますか?

回答 #4) 上記のように、サービスの外部に受信者クラスを構築する必要はありませんが、完全に機能するサービス クラスに損傷を与えることなく操作するのが最も簡単なように思われました...受信者クラス内の個々の意図は、アタッチされたアクション キーと、アクションが必要な特定のインテントが構築され、サービス クラスに送信されました...

于 2013-09-16T00:10:29.810 に答える