2012-08-13 17 views
7

Tworzę aplikację, która wyświetla bieżącą odtwarzaną piosenkę notification.Jak anulować powiadomienie o nieoczekiwanym/wymuszonym zamknięciu aplikacji

Piosenka jest odtwarzana przez Service & inicjowanie & anulowanie powiadomienia odbywa się w samej usłudze.

Ale jeśli aplikacja zostanie zakończona przez jakiś wyjątek lub wymuszam zamknięcie go za pośrednictwem menedżera zadań, powiadomienie pozostaje na górze na pasku zadań.

Jak mogę to usunąć.

Poniżej znajduje się kod:

//In Service onStartCommand(), there is a call to initiatePlayback() 
private void initiatePlayback() { 
    try { 
     if (mPlayer.isPlaying()) { 
      mPlayer.stop(); 
     } 
     mPlayer.reset(); 
     mPlayer.setDataSource(currentData); 
     mPlayer.prepare(); 

     if (reqAudioFocus()) { 
      mPlayer.start(); 
     } 

     if (mPlayer.isPlaying()) { 
      initNotification(); 
     } 
    } catch (Exception e) { 
     Toast.makeText(this, 
       "PlayTrack->initiatePlayback(): " + e.toString(), 
       Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public void onDestroy() { 
    stopPlayback(); 
    mPlayer.release(); 
    mPlayer = null; 
    super.onDestroy(); 
} 

private void stopPlayback() { 
    if (mPlayer.isPlaying()) { 
     mPlayer.stop(); 
     mPlayer.reset(); 
     cancelNotification(); 
    } 
} 
private void cancelNotification() { 
     String ns = Context.NOTIFICATION_SERVICE; 
     NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); 
     mNotificationManager.cancel(NOTIFICATION_ID); 
    } 
+2

sprawdzić to: http://stackoverflow.com/questions/12997800/cancel-notification-on-remove-application-from-multitask-panel –

Odpowiedz

0

Można zastąpić onDestroy() metodę i używać NotificationManager anulować powiadomienia. Musisz tylko podać swój identyfikator powiadomienia, które powinno zostać anulowane.

@Override 
public void onDestroy() { 

    private static final int MY_NOTIFICATION_ID= 1234; 
    String ns = Context.NOTIFICATION_SERVICE; 
    NotificationManager mNotificationManager; 
    mNotificationManager = (NotificationManager) getSystemService(ns); 
    mNotificationManager.notify(MY_NOTIFICATION_ID, notification); 
    //to cancel: 
    mNotificationManager.cancel(MY_NOTIFICATION_ID); 
} 
+0

sorry..didn't załadowany cały ten obowiązujących, odnośnych code..doing only..code added – reiley

+0

@ raul8 Moja propozycja rozwiązania powinna nadal działać w twojej sprawie, ponieważ twoja aplikacja przechodzi w stan onDestroy po jej zakończeniu i możesz po prostu anulować powiadomienie przy pomocy przykładowego kodu, który udostępniłem. Próbowałeś to zrobić? –

+3

tak. Problem polega na tym, że OnDestroy nie jest nawet wywoływany. Używam menedżera zadań "System". Rzecz w tym, że inni gracze nawet się nie zamykają i myślę, że to jest poprawna funkcja. Więc teraz postaram się nie zatrzymywać odtwarzania z bliska za pomocą menedżera zadań. – reiley

1

połowu wyjątek i w klauzuli catch anulować go:

mNotificationManager.cancel(MY_NOTIFICATION_ID); 
1

Wiem, że to pytanie jest stary, ale okazało się to, kiedy uważa się, że ma podobny problem. Okazało się, że usługa została zabita wraz z aplikacją (która poprawnie anulowała powiadomienie w onDestroy), ale potem została ponownie uruchomiona (tak jak powinna za START_STICKY), a powiadomienie zostało wysłane ponownie. W tych przypadkach nie chciałem, aby usługa wracała, dopóki użytkownik nie zainicjował jej z aplikacji, więc w OnStartCommand nazwałem stopSelf(), gdy intencja przychodząca była zerowa.

0

można złapać błędy, które rozkładają swoją aplikację z:

Thread.setDefaultUncaughtExceptionHandler(newHandler); 

Należy pamiętać, że w ten sposób będzie w stanie aplikacja do zamknięcia po drodze wyjątku, więc trzeba się starą odniesienie exceptionHandler i nazywają to od Ciebie .

Dodaj również kod, aby usunąć powiadomienie o tej metodzie.