2012-08-13 9 views
7

Estoy creando una aplicación que muestra notification de la canción actual.Cómo cancelar la notificación en la terminación de aplicación inesperada/forzada

La canción se está reproduciendo a través de Service & la iniciación & la cancelación de la notificación se realiza en el propio servicio.

Pero si la aplicación finaliza con alguna excepción o si forzo a cerrarla mediante el administrador de tareas, la notificación permanece en la parte superior de la barra de tareas.

¿Cómo puedo eliminar esto.

A continuación se muestra el código:

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

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

Respuesta

0

Puede anular onDestroy() método y utilizar el NotificationManager cancelar su notificación. Solo necesita proporcionar su ID de la notificación que debe cancelarse.

@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 carga el relavant toda code..doing este only..code added – reiley

+0

@ raul8 Mi propuesta de solución aún debería funcionar para su caso, ya que su aplicación entraría en estado Destroy cuando se termine y simplemente puede cancelar la notificación con la muestra de código que compartí. ¿Has intentado hacerlo? –

+3

sí ... el problema es que OnDestroy ni siquiera se llama. Estoy usando el administrador de tareas 'Sistema'. El problema es que otros jugadores ni siquiera se cierran y creo que es una funcionalidad correcta. Así que ahora intentaré no detener la reproducción al cerrar la fuerza a través del administrador de tareas. – reiley

1

captura la excepción y en la cláusula catch cancelarla:

mNotificationManager.cancel(MY_NOTIFICATION_ID); 
1

Sé que esta pregunta es viejo, pero me encontré cuando creía estar teniendo un problema similar. Resultó que el servicio se estaba eliminando junto con la aplicación (que canceló correctamente la notificación en onDestroy), pero luego se reinició (como debería hacerse con START_STICKY) y la notificación se volvió a publicar. En estos casos, no quería que el servicio volviera hasta que el usuario lo inició desde la aplicación, por lo que en OnStartCommand llamé a stopSelf() cuando el intento entrante era nulo.

0

Usted puede coger los errores que rompen su aplicación con:

Thread.setDefaultUncaughtExceptionHandler(newHandler); 

Tenga en cuenta que haciendo esto no su aplicación a cerrar después de una excepción, por lo que necesita para obtener la edad de referencia ExceptionHandler y llamarlo a la suya .

Además, agregue el código para eliminar la notificación de este método.

Cuestiones relacionadas