更新通知文本,而不是整个通知

Dav*_*ini 44 android android-notifications

序幕

我正在尝试在通知上添加计时器.计时器是一项服务.每一行调用此行(继续Thread是一个"running"布尔值,timeString是精心设计的String,显示时间):

NotificationChrono.updateNotification(getApplicationContext(), continueThread, 
NOTIF_ID, timeString, "Chronometer", notificationManager);
Run Code Online (Sandbox Code Playgroud)

这是NotificationChrono类:

public class NotificationChrono {

    static public void updateNotification(Context context, boolean running,
        int id, String title, String text,
        NotificationManager notificationManager) {

        Intent stopIntent = new Intent("com.corsalini.david.barcalc.STOP");
        PendingIntent stopPendingIntent = PendingIntent.getBroadcast(context,
            0, stopIntent, 0);

    Intent startIntent = new Intent(
            "com.corsalini.david.barcalc.STARTPAUSE");
    PendingIntent startPendingIntent = PendingIntent.getBroadcast(context,
            0, startIntent, 0);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(
            context)

            .setContentText(context.getString(R.string.notif_text))

            .setContentTitle(title)

            .setSmallIcon(R.drawable.ic_action_alarm_2)

            .setAutoCancel(false)

            .setOngoing(running)

            .setOnlyAlertOnce(true)

            .setContentIntent(
                    PendingIntent.getActivity(context, 10, new Intent(
                            context, FrontActivity.class)
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), 0))
            .addAction(
                    running ? R.drawable.ic_action_pause
                            : R.drawable.ic_action_play,
                    running ? context.getString(R.string.pause) : context
                            .getString(R.string.start), startPendingIntent)
            .addAction(R.drawable.ic_action_stop,
                    context.getString(R.string.stop), stopPendingIntent);

    notificationManager.notify(id, builder.build());
}
}
Run Code Online (Sandbox Code Playgroud)

问题

每隔一秒,通知就会被删除并重新创建,从视觉上来说,这意味着每秒通知都会消失并重新出现在通知列表中.

我想要的只是更新TITLE文本,而不是每秒都重新创建通知.可能吗?

Pie*_*lse 98

确保NotificationCompat.Builder每次都使用相同的构建器来创建Notification!

虽然第一次必须设置所有内容,但第二次使用Builder时只需要设置要更新的值.之后notificationManager.notify(id, builder.build())就像你一样打电话.如果您使用相同的,ID则通知会更新(重要!).

例:

//First time
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
            .setContentText(context.getString(R.string.notif_text))
            .setContentTitle(title)
            .setSmallIcon(R.drawable.ic_action_alarm_2)
            .setAutoCancel(false)
            .setOngoing(running)
            .setOnlyAlertOnce(true)
            .setContentIntent(
                    PendingIntent.getActivity(context, 10, 
                            new Intent(context, FrontActivity.class)                                 
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP),
                    0)
            )
            .addAction(running ? R.drawable.ic_action_pause 
                               : R.drawable.ic_action_play,
                       running ? context.getString(R.string.pause)
                               : context.getString(R.string.start),
                       startPendingIntent)
            .addAction(R.drawable.ic_action_stop, context.getString(R.string.stop),
                    stopPendingIntent);

notificationManager.notify(id, builder.build());

//Second time
builder.setContentTitle(title);
notificationManager.notify(id, builder.build());
Run Code Online (Sandbox Code Playgroud)

但您也可以使用该类的setUsesChronometer方法NotificationCompat.这会使用给定的时间戳自动显示计时器(能够使用setWhen设置).

  • @Rena您可以通过执行以下操作来获取Android中的NotificationManager:Java中的“NotificationManager notificationManager = getSystemService(NotificationManager.class);”或Kotlin中的“val notificationManager:NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager”。 (3认同)

GaR*_*eTa 9

您需要将通知标记为“仅提醒一次”

Builder#setOnlyAlertOnce(true)
Run Code Online (Sandbox Code Playgroud)


小智 6

感谢 PieterAelse 的想法!

在我的情况下,我不得不在第二次和以下时间使用这个(构建一个新的通知):

        builder.setContentText(getConvertedTime(millisUntilFinished));
        Notification notification = builder.getNotification();
        notification.flags = Notification.FLAG_ONGOING_EVENT;            
        nm.notify(R.string.app_name,notification);
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。