¿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á.

3 Solutions collect form web for “¿La actualización de una notificación elimina el estado de primer plano de un servicio?”

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); } 
  • Android: Leyendo la etiqueta NFC en la clase de servicio
  • ¿Cómo manejar IPC entre un servicio y una actividad (y su subactividad)?
  • Obtener Excepción al mostrar el cuadro de diálogo de alerta de servicio - No se puede agregar ventana - el símbolo nulo no es para una aplicación
  • Android: Enviar correo electrónico con datos adjuntos automáticamente en segundo plano
  • Anfitrión androide de Android y sueño del dispositivo
  • Uso de Service, TimerTask y BroadcastReceiver para comprobar si hay varias actualizaciones
  • Usuario apropiado del servicio de fondo / receptor de difusión
  • ¿Cómo puedo detener el servicio de otra aplicación en Android?
  • Emulador de Android: ¿Cómo puedo obtener una lista de servicios que se están ejecutando
  • Diferencia entre RTC y RTC_WAKEUP en android
  • OnBind () en servicio siempre devuelve Falso - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.