service edición - ¿Cómo actualizo el texto de notificación para un servicio de primer plano en Android?




móviles 2018 (5)

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

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.


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.


La respuesta de Ted para aclarar un color no me funcionaba, así que aquí hay una solución que podría ayudar a alguien más:

/**
 * Lightens a color by a given factor.
 * 
 * @param color
 *            The color to lighten
 * @param factor
 *            The factor to lighten the color. 0 will make the color unchanged. 1 will make the
 *            color white.
 * @return lighter version of the specified color.
 */
public static int lighter(int color, float factor) {
    int red = (int) ((Color.red(color) * (1 - factor) / 255 + factor) * 255);
    int green = (int) ((Color.green(color) * (1 - factor) / 255 + factor) * 255);
    int blue = (int) ((Color.blue(color) * (1 - factor) / 255 + factor) * 255);
    return Color.argb(Color.alpha(color), red, green, blue);
}




android service notifications foreground