28

Pracuję więc nad prostym odtwarzaczem muzyki. Odtwarzacz muzyki, jak nazywał stany, może odtwarzać utwór, wstrzymać odtwarzanie, przejść do następnego utworu, wrócić do poprzedniego utworu i całkowicie zatrzymać odtwarzanie. Podczas odtwarzania utworu zostanie wyświetlone powiadomienie z nazwą wykonawcy i nazwą utworu; to powiadomienie ma również trzy przyciski (Akcje): Zatrzymaj, Zatrzymaj następny.Jak korzystać z działań z powiadomienia bez uruchamiania działalności

Problem polega na upewnieniu się, że po kliknięciu dowolnej akcji zostanie uruchomione sterowanie odtwarzaniem powiązane z akcją i nie mam absolutnie pojęcia, jak to zrobić. Przeszukałem Powiadomienie Androida: http://developer.android.com/guide/topics/ui/notifiers/notifications.html, ale nie wyjaśnia ono, ani nie poświęca zbyt wielu informacji o akcjach powiadomień.

Oto prosty przykład działania (które powinny być związane z „Dalej” Kliknij przycisk na zgłoszenia: Uwaga: Cały kod opisany poniżej jest napisane pod następującym pakiecie: com.deadpixels.light .player a aktywność nazywa się: 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)); 
    } 
} 

Oto co próbowałem zrobić:

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

Jeżeli akcja dla NextIntent jest:

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

a następnie dodać, że do zgłoszenia poprzez Addaction():

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

Czy faceci wiedzą, co jeszcze mogę spróbować? Korzystanie z tego, co wyjaśniłem powyżej, nic nie robi, pojawia się powiadomienie i ma trzy przyciski akcji, ale kliknięcie na nich nic dla mnie nie robi.

W pewnym momencie pomyślałem, że może jeśli dodałem filtry intencji z nazwami akcji, ale wtedy pomyślałem, że wszystkie są w tej samej przestrzeni nazw, dlaczego powinienem?

Odpowiedz

43

Rozwiązałem ten problem za pomocą transmisji. Na przykład, aby wysłać transmisję że przejście do następnego utworu, można użyć następujący:

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

Następnie zarejestrować BroadcastReceiver w swoim 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); 

Jeśli korzystasz z usługi aby zarządzać odtwarzaniem w tle, musisz zarejestrować usługę BroadcastReceiver w usłudze zamiast aktywności. Pamiętaj, aby gdzieś przechowywać instancję receiver, aby można było ją wyrejestrować po zamknięciu działania lub usługi.

+1

Pamiętaj, aby zachować instancję odbiornika. Przechowywać w miejscu? –

+0

@anonimowy Zachowaj odniesienie do niego w swojej działalności lub usłudze. – acj

+1

Dlaczego nie rejestrujesz BroadcastReceiver w manifeście i nie tworzysz osobnej klasy? – streamride

Powiązane problemy