28

Also arbeite ich an einem einfachen Musik-Player. Der Musikplayer, wie er Namen nennt, kann einen Titel wiedergeben, die Wiedergabe anhalten, zum nächsten Titel weitergehen, zum vorherigen Titel zurückkehren und die Wiedergabe vollständig anhalten. Wenn Sie einen Song abspielen, wird eine Benachrichtigung mit dem Künstlernamen und dem Song-Namen angezeigt. Diese Benachrichtigung hat auch drei Schaltflächen (Aktionen): Stopp, Pause und Weiter.So verwenden Sie Aktionen von Notification, ohne zu starten Aktivität

Worauf ich Probleme habe, ist sicherzustellen, dass, wenn auf eine Aktion geklickt wird, die Wiedergabesteuerung für die Aktion ausgelöst wird, und nun, ich habe absolut keine Ahnung, wie das geht. Ich suchte die Android-Benachrichtigung: http://developer.android.com/guide/topics/ui/notifiers/notifications.html, aber es klärt nicht, oder widmet zu viele Informationen zu Benachrichtigungsaktionen.

Hier ist eine einfache Aktion zum Beispiel (die mit der Schaltfläche „Weiter“ klicken Sie auf die Meldung zugeordnet werden soll: Hinweis: gesamte Code unten geschrieben wird unter dem folgenden Paket beschrieben: com.deadpixels.light .Player und die Aktivität heißt: 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)); 
    } 
} 

Hier ist, was ich zu tun versucht:

Intent nextIntent = new Intent(KEY_NEXT); 
PendingIntent nextPendingIntent = createPendingResult(0, nextIntent, 0); 

Wo die Aktion für das NextIntent ist:

public static final String KEY_NEXT = "com.deadpixels.light.player.PlayerActivity.nextSong"; 

und dann auf die Benachrichtigung über addAction ich hinzufügen, dass():

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

Haben Sie Jungs wissen, was könnte ich versuchen? Mit dem, was ich oben erklärt habe, geht gar nichts, die Benachrichtigung erscheint, und hat drei Aktionsknöpfe, aber das Klicken auf sie tut nichts für mich.

An einem Punkt dachte ich vielleicht, wenn ich die Absicht Filter mit den Action-Namen hinzugefügt, aber dann dachte ich, nun, sie sind alle auf dem gleichen Namensraum, warum sollte ich?

Antwort

43

Ich habe dieses Problem mit Broadcasts gelöst. Um zum Beispiel eine Sendung zu senden, um zum nächsten Titel geht, können Sie die folgenden Befehle verwenden:

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

Dann registrieren Sie einen BroadcastReceiver in Ihrem Activity:

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); 

Wenn Sie einen Dienst verwenden Um die Hintergrundwiedergabe zu verwalten, sollten Sie die BroadcastReceiver im Dienst anstelle der Aktivität registrieren. Stellen Sie sicher, dass die receiver -Instanz gespeichert ist, damit Sie die Registrierung aufheben können, wenn die Aktivität oder der Dienst heruntergefahren wird.

+1

Achten Sie darauf, die Empfängerinstanz zu speichern. Speichern wo? –

+0

@anonymous Behalte in deinen Aktivitäten oder Diensten einen Hinweis darauf. – acj

+1

Warum registrieren Sie BroadcastReceiver nicht in Manifest und als separate Klasse? – streamride