通知在更新时跳过另一个通知

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通知在更新时跳过另一个通知相关的知识,希望对你有一定的参考价值。

我有一个服务,可以在不同的线程中同时执行多个下载。对于每次下载,都会显示带有进度的通知。进度每秒更新一次。如果您同时运行三个或更多下载,当您更新通知时,他们会随机更改状态栏中的位置,跳过另一个。我尝试设置优先级setPriority (priority),我使用setOnlyAlertOnce (true),但这没有帮助。与此同时,在其他一些应用程序中,我看到通知在他们的位置更新。

问题是,如何实现这一目标?

目前,我的通知创建如下:

private LongSparseArray<Task> mTasksArray = new LongSparseArray<>();
private int notifyId = 0;
...

//setup notification id on task download start
private void initTask(long taskId) {
    Task task = new Task();
    ...
    task.setNotificationId(notifyId++);
    mTasksArray.put(taskId, task);
}

...

//notification update, called about once a second for every running download
private void showNotify(Task task) {
    int notificationId = task.getNotificationId();
    Notification notification = getProgressNotification(task);

    mNotifyManager.notify(notificationId, notification);
}

@NonNull
private Notification getProgressNotification(Task task) {
    int max = task.getTotal();
    int count = task.getCount();

    /**
     * using id of notification as priority, but actual priority values can be only from -2 to 2
     * right now it can show three first downloads correctly (for id values 0,1,2), but if,
     * for example, stop first task and start another one, next id and priority will be 3
     * (actually priority will be 2, because max priority is 2) and 3th and 4th notifications
     * will reorder on every update, because of same priority
     */
    int priority = task.getNotificationId();

 NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, CHANNEL_ID);
    builder.setContentTitle(mContext.getString(R.string.notif_title_downloading))
            .setOnlyAlertOnce(true)
            .setOngoing(true)
            .setPriority(priority)
            .setSmallIcon(R.drawable.ic_file_download_white_24dp)
            .setProgress(max, count, false)
            .addAction(getPauseAction(task))
            .addAction(getStopAction(task))
            .setContentText(String.format(Locale.ENGLISH, "%d/%d", count, max));
    return builder.build();
}

更新。

答案

您需要为每个后续更新使用相同的通知构建器。例如:

//First time
NotificationCompat.Builder builder = new NotificationCompat.Builder(...)
...
notificationManager.notify(id, builder.build());
//Second time
builder.setProgress(max, count, false);
notificationManager.notify(id, builder.build());

以上是关于通知在更新时跳过另一个通知的主要内容,如果未能解决你的问题,请参考以下文章

保存时跳过字段(Django 模型、插入和更新)

运行 `npm -g outdated` 时跳过一个包

如何在不与 MainActivity 交互的情况下从通知中打开片段页面?

在 R 中满足条件时跳过一行代码

在 NGINX 中执行 301 重定向时跳过参数

在 Visual Studio 2012 中调试 C++ 代码时跳过 STL 代码?