¿La actualización de una notificación elimina el estado de primer plano de un servicio?

En mi aplicación, pongo mi servicio en primer plano para evitar que se maten mediante el uso de:

startForeground(NOTIFY_ID, notification); 

Esto también muestra la notificación al usuario (que es grande). El problema es que más tarde necesito actualizar la notificación. Así que utilizo el código:

 notification.setLatestEventInfo(getApplicationContext(), someString, someOtherString, contentIntent); mNotificationManager.notify(NOTIFY_ID, notification); 

La pregunta entonces es: ¿va a hacer esto golpear al servicio fuera de su estado especial en primer plano?

En esta respuesta , CommonsWare indica que este comportamiento es posible, pero no está seguro. ¿Así que alguien sabe la respuesta real?


Nota: Soy consciente de que una forma sencilla de salir de esta pregunta es llamar repetidamente a startForeground() cada vez que desee actualizar la notificación. Estoy buscando saber si esta alternativa también funcionará.

La aplicación de RandomMusicPlayer en el sitio de desarrolladores de Android utiliza NotificationManager para actualizar la notificación de un servicio de primer plano, por lo que es muy probable que retenga el estado de primer plano.

(Consulte setUpAsForeground () y updateNotification () en la clase MusicService.java.)

Por lo que entiendo, si cancelas la notificación, el servicio dejará de ser un servicio de primer plano, así que tenlo en cuenta; Si cancela la notificación, deberá volver a llamar a startForeground () para restaurar el estado del primer plano del servicio.

Para aclarar lo que se ha dicho aquí:

Por lo que entiendo, si cancelas la notificación, el servicio dejará de ser un servicio de primer plano, así que tenlo en cuenta; Si cancela la notificación, deberá volver a llamar a startForeground () para restaurar el estado del primer plano del servicio.

Esta parte de la respuesta sugiere que es posible eliminar una Notification curso establecida por un Service mediante NotificationManager.cancel() en la Notification persistente. Esto no es verdad. Es imposible eliminar una notificación en curso establecida por startForeground() mediante NotificationManager.cancel() .

La única manera de eliminarlo es llamar stopForeground(true) , por lo que la notificación en curso se elimina, lo cual también hace que el Service deje de estar en primer plano. Así que en realidad es al revés; El Service no deja de estar en primer plano porque la Notification se cancela, la Notification sólo se puede cancelar deteniendo el Service en primer plano.

Naturalmente uno podría llamar a startForeground() después de esto de inmediato, para restaurar el estado con una nueva Notification . Una de las razones por las que desearía hacer esto es que se vuelva a mostrar un texto de ticker, ya que sólo se ejecutará la primera vez que se muestre la Notification .

Este comportamiento no está documentado, y perdí 4 horas tratando de averiguar por qué no pude eliminar la Notification . Más sobre el tema aquí: NotificationManager.cancel () no funciona para mí

Cuando desee actualizar un conjunto de notificaciones por startForeground (), simplemente cree una nueva notificación y luego use NotificationManager para notificarlo.

El punto clave es usar el mismo id de notificación.

Actualizar la Notificación NO eliminará el Servicio del estado de primer plano (esto se puede hacer solamente llamando a stopForground);

Ejemplo:

 private static final int notif_id=1; @Override public void onCreate (){ this.startForeground(); } private void startForeground() { startForeground(notif_id, getMyActivityNotification("")); } private Notification getMyActivityNotification(String text){ // The PendingIntent to launch our activity if the user selects // this notification CharSequence title = getText(R.string.title_activity); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MyActivity.class), 0); return new Notification.Builder(this) .setContentTitle(title) .setContentText(text) .setSmallIcon(R.drawable.ic_launcher_b3) .setContentIntent(contentIntent).getNotification(); } /** this is the method that can be called to update the Notification */ private void updateNotification() { String text = "Some text that will update the notification"; Notification notification = getMyActivityNotification(text); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(notif_id, notification); } 
  • ¿Cómo utilizar PendingIntent para comunicarse desde un servicio a un cliente / actividad?
  • ¿Cómo ejecutar un servicio de 9 AM a 4 PM todos los días?
  • Android: Detener / iniciar servicio creado en onCreate ()
  • OnBind () en servicio siempre devuelve Falso - Android
  • Detectar bloqueo de servicio
  • Android startActivity de la intención en el servicio
  • Devolver un resultado de error en inKeyguardRestrictedInputMode ()
  • Cómo supervisar el cambio de estado de SIM
  • ¿Cómo ejecutar una aplicación Android en segundo plano?
  • Aplicación de Android como servicio sin actividad
  • Actividad con servicio duradero en el fondo que no se matará
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.