28

シンプルな音楽プレーヤーで作業しています。音楽プレイヤーは状態に名前を付け、曲を再生したり、再生を一時停止したり、次の曲に転送したり、前の曲に戻ったり、完全に停止したりすることができます。曲を再生すると、アーティスト名と曲名が表示されます。この通知には、「停止」、「次へを一時停止」の3つのボタン(アクション)もあります。アクティビティを開始せずに通知からアクションを使用する

私が問題を抱えているのは、いずれかのアクションがクリックされたときに、そのアクションに関連する再生コントロールが起動されていることを確認していることです。私はAndroidの通知:http://developer.android.com/guide/topics/ui/notifiers/notifications.htmlを検索しましたが、通知アクションについてあまりにも多くの情報を明確にしたり、捧げたりしていません。 注:下記のコードはすべて、次のパッケージの下に書かれている:com.deadpixels.lightここ

は、通知の上、「次へ」ボタンをクリックすると関連するべきであるインスタンスのためのシンプルなアクション(あります .playerとアクティビティが呼び出されます。ここではPlayerActivity

public void nextSong() { 
    if (position == songs.size() -1) { 
     Toast.makeText(this, "No more songs on queue", Toast.LENGTH_SHORT).show(); 
     if(mPlayer.isPlaying()) { 
      return; 
     } 
     else { 
      buttonPlay.setImageResource(R.drawable.button_play); 
     } 
     return; 
    } 
    else { 
     position++; 
     playSong(songs.get(position)); 
    } 
} 

は私がしようとしたものです:

Intent nextIntent = new Intent(KEY_NEXT); 
PendingIntent nextPendingIntent = createPendingResult(0, nextIntent, 0); 
public static final String KEY_NEXT = "com.deadpixels.light.player.PlayerActivity.nextSong"; 

し、私はaddAction()を介して通知することを追加します:はNextIntentのためのアクションがある場合は

mBuilder.addAction(R.drawable.not_action_next, "Next", nextPendingIntent); 

は、あなたたちは、私が試みることができる他に何を知っていますか?上で説明したものを使用すると、何もしないで、通知が表示され、3つのアクションボタンがありますが、それらをクリックすると何もしません。

ある時点で、アクション名を含むインテントフィルタを追加したとしたら、同じ名前空間にすべて同じ名前が付けられていると思ったのですが、どうしてでしょうか?

答えて

43

ブロードキャストを使用してこの問題を解決しました。たとえば、次の曲に進みブロードキャストを送信するために、あなたは以下を使用することができます。

Intent nextIntent = new Intent(KEY_NEXT); 
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(this, 0, nextIntent, 0); 

次に、あなたのActivityBroadcastReceiverを登録します。

IntentFilter filter = new IntentFilter(); 
filter.addAction(KEY_NEXT); 
// Add other actions as needed 

receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(KEY_NEXT)) { 
      nextSong(); 
     } else if (...) { 
      ... 
     } 
     ... 
    } 
} 

registerReceiver(receiver, filter); 

あなたがサービスを使用している場合バックグラウンド再生を管理するには、アクティビティの代わりにBroadcastReceiverをサービスに登録する必要があります。 receiverインスタンスは、アクティビティまたはサービスがシャットダウンされたときに登録を解除できるように、どこかに保管してください。

+1

受信者のインスタンスを保管してください。 –

+0

@anonymousあなたの活動やサービスにそれを参照してください。 – acj

+1

なぜ、BroadcastReceiverをマニフェストに登録して、別のクラスとして作るのですか? – streamride

関連する問題