16

Próbuję dodać element powiadomienia o powiadomieniu do mojej aplikacji, która jest odtwarzaczem muzyki. Po uruchomieniu strumienia powiadomienie powinno zostać wyzwolone, a przycisk powiadomienia o strumieniu powinien zostać wyświetlony w notyfikacji. Powiadomienie działa poprawnie, mam problem z elementem zatrzymania. Oto jak to jest uznane w służbie uruchomieniem strumienia.Powiadomienie o Androidzie nie jest uruchamiane (PendingIntent)

Intent stopIntent = new Intent(this, MusicPlayerNew.class); 
stopIntent.putExtra("STOP", "STOP"); 
PendingIntent stopPendingIntent = PendingIntent.getActivity(this, 0, 
       stopIntent, PendingIntent.FLAG_UPDATE_CURRENT, null); 
mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent); 

Teraz w onResume() - metoda mojej działalności Sprawdzę getIntent() getStringExtra() na „STOP” ekstra, ale intencją I pobrana poprzez getIntent() ma ustawione żadnych dodatków :(

próbowałem też sprawdzić, aby wysłać transmisję (mam odbiornik rozgłaszania roboczą do komunikowania się z usługą do aktywności)

Intent stopIntent2 = new Intent(MusicPlayerNew.STOP_MEDIAPLAYER); 
PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0, 
       stopIntent2, PendingIntent.FLAG_UPDATE_CURRENT); 
mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent2); 

teraz działa to, jeśli aktywność jest obecnie na pierwszym planie n tło przycisk stop robi nic :(

EDIT: mam BroadcastReceiver w mojej działalności jako prywatny klasy

private class DataUpdateReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
.. 
}} 

W onResume() Rejestracja Moje aplikację dla tego odbiornika:

intentFilter = new IntentFilter(STOP_MEDIAPLAYER); 
registerReceiver(dataUpdateReceiver, intentFilter); 

OnPause()

unregisterReceiver(dataUpdateReceiver); 

Teraz, jeśli usunę wyrejestrowanie z metody onPause() - transmisja zostanie odebrana, nawet jeśli aplikacja/aktywność nie jest już na pierwszym planie. Ale czy to właściwa droga? Mam ten rejestr/unregister-stuff z samouczka w Internecie, myślę, że ...

+0

Mam ten sam problem na KitKat. Mam dwie akcje, najpierw nazywane grzywną, drugą nie wzywaną. Czy znalazłeś sposób na rozwiązanie tego problemu? – Nik

+0

Ok, znalazłem rozwiązanie. Zobacz moją odpowiedź na dole. – Nik

Odpowiedz

9

znajdę rozwiązanie w tym wątku na Google Code https://code.google.com/p/android/issues/detail?id=61850

go naprawić trzeba dodać PendingIntent.FLAG_CANCEL_CURRENT flagę do PendingIntent.

PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0, 
      stopIntent2, PendingIntent.FLAG_CANCEL_CURRENT); 
+0

Dzięki. To naprawdę doprowadzało mnie do szału, gdy miałem podobny problem. To załatwiło sprawę. Być może ponowne uruchomienie urządzenia też by pomogło, ale to jest czyste. – sivag1

0

Nie odbierzesz transmisji, gdy jest ona w tle, ponieważ wyrejestrujesz się w trybie onPause. Przenieś kod unregisterReceiver do funkcji OnDestroy. Będzie to wywoływane tylko wtedy, gdy działanie zostanie zniszczone. Możesz też wyrejestrować się po wystąpieniu oczekiwanego zdarzenia.

2

Więcej niż używanie odbiornika przekazu, należy skorzystać z usługi i zadeklarować nową akcję w swojej służbie w ten sposób:

public final String ACTION_STOP = "yourpackagename.ACTION_STOP"; 

a następnie utworzyć swoje zamiary tak:

Intent stopIntent = new Intent(this, YourService.class).setAction(YourService.ACTION_STOP); 
PendingIntent stopPendingIntent = PendingIntent.getService(this, 0, stopIntent, 0); 

Oczywiście , zatrzymaj odtwarzanie w funkcji usługi startCommand, jeśli działanie intencji wynosi ACTION_STOP.

To powinno załatwić sprawę;)

0

Istnieje wiele pytań tutaj:

Część 1: Dlaczego Twój intencją nie odbiera "STOP" ekstra? Chociaż nie jest to widoczne w podanym kodzie, chciałem potwierdzić, czy używasz flagi FLAG_ACTIVITY_SINGLE_TOP dla zamiaru powiadomienia? Jeśli tak, intencją, którą otrzymasz w swojej działalności, byłaby intencja, która zapoczątkowała działanie, a zatem dodatek "STOP" nie będzie dostępny. Konieczne będzie przedłużenie onNewIntent() w tym przypadku (w przypadku wysłania nowego zamiaru). More info here.
Jeśli nie użyto FLAG_ACTIVITY_SINGLE_TOP, oznacza to, że po dotknięciu powiadomienia tworzone jest nowe działanie, w którym to przypadku cel musi mieć parametr "STOP". Jeśli możesz podać mi cały odpowiedni kod, mogę ci pomóc lepiej.

Część 2: Korzystanie z odbiornika Broadcast To nie jest proste, jak już odkryłeś. Będziesz musiał wyrejestrować się w OnDestroy i jeśli twoja aktywność zostanie zamknięta przez użytkownika, może zostać wywołany onDestroy, a twój odbiornik może nie być aktywny w momencie, gdy powiadomienie zostanie dotknięte przez użytkownika. Jeśli w ogóle się nie wyrejestrujesz, może się wydawać, że działa, ale jest to wyciek pamięci, GC może w każdej chwili posprzątać, co może doprowadzić do awarii twojego programu, tj. MUSISZ wyrejestrować się. Jeśli potrzebujesz podejścia z odbiornikiem, musisz mieć do tego usługę, a usługa ma własne pułapki -> restart przez system, rozładowanie baterii itp. Zdecydowanie polecam, abyś podszedł z pierwszym podejściem.

5

wpadłem na ten problem dzisiaj i było to spowodowane przez działalność nie jest zarejestrowana lub dodanego do AndroidManifest.xml. Myślałem, że mam to, ale nie było. Ponadto żadne błędy nie były rejestrowane przez próbę wywołania działania z jego intencją.

Wyjaśniałem to, tworząc intencję, a następnie wywołując funkcję startAcitivty (zamiar) bez użycia powiadomienia. Dało mi to błąd, stwierdzając, że najprawdopodobniej brakowało aktywności w manifeście.

Jeśli żadna z pozostałych odpowiedzi nie rozwiąże problemu, to miejmy nadzieję, że tak będzie. Zwykle trudne problemy są wynikiem czegoś prostego i głupiego.

6

Wpadłem dziś na ten problem. W moim przypadku korzystał on z buforowanych dodatków intencyjnych z poprzedniej instancji intencji, ponieważ wszystkie parametry dla konstruktorów pendingIntent były takie same. Znalazłem dwa rozwiązania tego ...

  1. Używanie FLAG_CANCEL_CURRENT, o którym wspomniał Nik.
  2. Przechodząc unikalny requestCode do pendingIntent następująco

    PendingIntent pi = PendingIntent.getService(this, UNIQUE_ID, pi, 0); 
    

w moim przypadku, druga metoda rozwiązała problem jak trzeba zachować wcześniejsze powiadomienia żyje. Może to pomoże komuś z podobnym problemem.

+0

Nie uważam, że UNIQUE_ID jest potrzebny, chyba że wystąpi konflikt z inną usługą. –

0

Miałem bardzo podobny problem, ale zupełnie inne rozwiązanie. Pending intent nie jest również zwalniany, jeśli zadeklarowałeś <service android:enabled="false"></service> w pliku manifest.xml.

Wymienić od android:enabled="false" do android:enabled="true"

to może nie być bezpośrednim kwestia problemu. Ale jeśli utworzysz usługę w Androidzie przy użyciu domyślnego szablonu, automatycznie doda te właściwości do usługi.

0

Dla mnie rozwiązaniem było ustawione flagi zamiarem:

resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
       Intent.FLAG_ACTIVITY_CLEAR_TASK); 
6

Jest bardzo późno odpowiedź, ale może komuś pomóc:

Należy wybrać odpowiedni rodzaj Czeka intencyjny w oparciu w intencji, którą chcesz uruchomić. Oto kilka przykładów:

Dla Aktywny użycie poniżej:

Intent i = new Intent(this, YourActivity.class); 
PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0); 

Dla Służby użycie poniżej:

Intent i = new Intent(this, YourService.class); 
PendingIntent pi = PendingIntent.getService(this, 0, i, 0); 

Dla Broadcast Receiver użycia poniżej:

Intent i = new Intent(this, YourReciver.class); 
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); 

Może zajść potrzeba zmiany kodu żądania i Flagi w razie potrzeby

Powiązane problemy