studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android service notifications foreground

para - manual de programacion android pdf



¿Cómo actualizo el texto de notificación para un servicio de primer plano en Android? (4)

Tengo una configuración de servicio en primer plano en Android. Me gustaría actualizar el texto de la notificación. Estoy creando el servicio como se muestra a continuación.

¿Cómo puedo actualizar el texto de notificación que está configurado 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);


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:

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); }

La documentation indica

Para configurar una notificación para que se pueda actualizar, publíquela con una ID de notificación llamando a NotificationManager.notify() . Para actualizar esta notificación después de haberla emitido, actualice o cree un objeto NotificationCompat.Builder , cree un objeto de Notification partir de él y emita la Notification con la misma ID que utilizó anteriormente. Si la notificación anterior todavía está visible, el sistema la actualiza desde el contenido del objeto de Notification . Si la notificación anterior ha sido descartada, se crea una nueva notificación en su lugar.


Mejorando la respuesta de Luca Manzo en Android 8.0+ al actualizar la notificación se emitirá sonido y se mostrará como Heads-up.
para evitar que necesite agregar setOnlyAlertOnce(true)

entonces el código es:

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){ if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){ ((NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel( NotificationChannel("timer_notification","Timer Notification",NotificationManager.IMPORTANCE_HIGH)) } // The PendingIntent to launch our activity if the user selects // this notification PendingIntent contentIntent=PendingIntent.getActivity(this, 0,new Intent(this,MyActivity.class),0); return new NotificationCompat.Builder(this,"my_channel_01") .setContentTitle("some title") .setContentText(text) .setOnlyAlertOnce(true) // so when data is updated don''t make sound and alert in android 8.0+ .setOngoing(true) .setSmallIcon(R.drawable.ic_launcher_b3) .setContentIntent(contentIntent) .build(); } /** * 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); }


aquí está el código para hacerlo en su servicio . Cree una nueva notificación, pero solicite al administrador de notificaciones que notifique el mismo ID de notificación que utilizó en startForeground.

Notification notify = createNotification(); final NotificationManager notificationManager = (NotificationManager) getApplicationContext() .getSystemService(getApplicationContext().NOTIFICATION_SERVICE); notificationManager.notify(ONGOING_NOTIFICATION, notify);

para obtener códigos de muestra completos, puede verificar aquí:

https://github.com/plateaukao/AutoScreenOnOff/blob/master/src/com/danielkao/autoscreenonoff/SensorMonitorService.java


startForeground() que llamar de nuevo a startForeground() con el mismo ID único y una Notification con la nueva información funcionaría, aunque no he probado este escenario.