2012-08-13 10 views
7

Sto creando un'applicazione che visualizza il notification del brano in riproduzione.Come annullare notifica inaspettata/forza app cessazione

Il brano viene riprodotto tramite Service & l'avvio & l'annullamento della notifica viene effettuato nel servizio stesso.

Ma se l'applicazione è terminato da qualche eccezione o se forzo chiuderlo tramite il task manager, la notifica rimane in alto sulla barra delle applicazioni.

Come posso rimuovere questo.

Di seguito si riporta il codice:

//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

controllo questo: http://stackoverflow.com/questions/12997800/cancel-notification-on-remove-application-from-multitask-panel –

risposta

0

È possibile ignorare onDestroy() metodo e utilizzare il NotificationManager di cancellare la vostra segnalazione. Devi solo fornire il tuo ID della notifica che dovrebbe essere cancellata.

@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 caricato l'intero relavant code..doing questo only..code aggiunto – reiley

+0

@ raul8 la mia proposta di soluzione dovrebbe ancora funzionare per il vostro caso, in quanto l'applicazione sarebbe andato in stato OnDestroy quando è terminato e si può semplicemente annullare la comunicazione con il codice di esempio ho condiviso. Hai provato a farlo? –

+3

sì..il problema è OnDestroy non viene nemmeno chiamato. Sto usando il task manager 'Sistema'. Il fatto è che gli altri giocatori non si chiudono nemmeno e penso che sia una funzionalità corretta. Quindi ora proverò a non interrompere la riproduzione in chiusura forzata tramite il task manager. – reiley

1

intercettare l'eccezione e nella clausola catch annullare esso:

mNotificationManager.cancel(MY_NOTIFICATION_ID); 
1

So che questa domanda è vecchio, ma ho trovato quando ho creduto di avere un problema simile. Si è rivelato per me, il servizio era stato ucciso insieme con l'applicazione (che giustamente annullato la notifica in OnDestroy), ma poi era stato riavviato (come dovrebbe con START_STICKY) e la notifica di essere postato di nuovo. In questi casi non volevo che il servizio tornasse fino a quando l'utente non l'ha avviato dall'app, quindi in OnStartCommand ho chiamato stopSelf() quando l'intento in entrata era nullo.

0

È possibile catturare gli errori che si rompono l'applicazione con:

Thread.setDefaultUncaughtExceptionHandler(newHandler); 

Si noti che questa operazione sarà in grado l'applicazione per chiudere dopo un'eccezione, quindi è necessario ottenere il vecchio riferimento exceptionHandler e chiamarlo dalla tua .

Inoltre, aggiungere il codice per rimuovere la notifica su questo metodo.

Problemi correlati