Tengo una configuración de servicio en primer plano en Android. Me gustaría actualizar el texto de notificación. Estoy creando el servicio como se muestra a continuación.
¿Cómo puedo actualizar el texto de notificación que se configura dentro de este servicio en primer plano? ¿Cuál es la mejor práctica para actualizar la notificación? Cualquier código de muestra sería apreciado.
public class NotificationService extends Service {
private static final int ONGOING_NOTIFICATION = 1;
private Notification notification;
@Override
public void onCreate() {
super.onCreate();
this.notification = new Notification(R.drawable.statusbar, getText(R.string.app_name), System.currentTimeMillis());
Intent notificationIntent = new Intent(this, AbList.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
this.notification.setLatestEventInfo(this, getText(R.string.app_name), "Update This Text", pendingIntent);
startForeground(ONGOING_NOTIFICATION, this.notification);
}
Estoy creando el servicio en mi actividad principal como se muestra a continuación:
// Start Notification Service
Intent serviceIntent = new Intent(this, NotificationService.class);
startService(serviceIntent);
startService()
para pasar un comando al servicio, simplemente llamestartService()
nuevamente para indicarle que actualice su texto. O, si está llamandobindService()
, agregue un método a su API para que el servicio actualice su texto. O bien, considere si el servicio en sí debería ser quien toma la decisión de actualizar o no el texto. O tal vez el texto es un tema en elSharedPeference
que el servicio tiene un oyente. Es imposible darle consejos precisos en abstracto.cancel()
una notificación porstartForeground()
. Debe eliminar el estado de primer plano del servicio en sí mismo (stopForeground()
si lo desea, si desea que el texto de ticker vuelva a aparecer. Perdí horas porque estas respuestas me llevaron a creer que, de hecho, era posible.NotificationManager
funcionó como esperaba.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 la misma identificación de notificación.
No probé el escenario de llamar repetidamente a startForeground () para actualizar la Notificación, pero creo que usar NotificationManager.notify sería mejor.
La actualización de la Notificación NO eliminará el Servicio del estado de primer plano (esto solo se puede hacer llamando a stopForground);
Ejemplo:
La documentación declara
fuente
notify()
ostartForeground()
ambos conducen a la llamadaonStartCommand()
.NotificationManager
para actualizar una notificación que se muestrastartForeground
es que las llamadasstopForeground
ya no eliminarán la notificación. Actualizándolo con otra llamada parastartForeground
evitar ese problema.Mejorando la respuesta de Luca Manzo en Android 8.0+ al actualizar la notificación, emitirá un sonido y se mostrará como Heads-up.
para evitar que necesites agregar
setOnlyAlertOnce(true)
entonces el código es:
fuente
new NotificationChannel
Aquí está el código para hacerlo en su servicio . Cree una nueva notificación, pero solicite al administrador de notificaciones que notifique la misma identificación de notificación que utilizó en startForeground.
Para ver códigos de muestra completos, puede consultar aquí:
https://github.com/plateaukao/AutoScreenOnOff/blob/master/src/com/danielkao/autoscreenonoff/SensorMonitorService.java
fuente
not foreground
enforeground created
mensaje.Parece que ninguna de las respuestas existentes muestran cómo manejar el caso completo: iniciar Groundground si es la primera llamada pero actualizar la notificación para las llamadas posteriores.
Puede usar el siguiente patrón para detectar el caso correcto:
Además, debe crear la notificación y el canal como en otras respuestas:
fuente