【问题标题】:Pin Notification to top of notification area将通知固定到通知区域的顶部
【发布时间】:2011-05-31 15:20:54
【问题描述】:

我有一个每三秒刷新(即发送)一次的通知。我已经设置了 FLAG_ONGOING_EVENT 标志和 FLAG_NO_CLEAR 标志,以便始终显示。问题是,如果例如下载处于活动状态(在通知区域中显示进度条)两个通知会不断切换位置,因为它们都每隔几秒刷新一次。

如何将我的通知固定到列表顶部(或某个静态位置),以便在我每次调用NotificationManager.notify() 更新它时它停止跳动?

编辑:这是更新通知的代码。它每三秒运行一次。

Notification notification = new Notification();
notification.contentView = appBarNotification; // this sets the changed notification content
notification.flags |= Notification.FLAG_ONGOING_EVENT;  
notification.flags |= Notification.FLAG_NO_CLEAR; 

Intent notificationIntent = new Intent();
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.contentIntent = contentIntent;
notification.icon = R.drawable.icon;

nm.notify(APP_BAR_NOTIFICATION, notification);

【问题讨论】:

  • 你每次拨打notify()时使用相同的ID吗?
  • 是的,我就是这么做的。我将在问题中发布相应的代码。

标签: android notifications


【解决方案1】:

有一种解决方案可以完全满足您的需求。

Notification 类中,有一个名为when 的公共字段。根据 API:

通知的时间戳。图标和展开视图按此键排序。

默认行为(对于代码和编码员来说:)是给 when 通知的时间戳:

notification.when = System.currentTimeMillis();

所以 - 为了保持通知的正确顺序,您需要做的就是给它一个预设的时间戳:

notification.when = previousTimestamp;

当您对所有通知执行此操作时,它们会保持其顺序。我遇到了和你一样的问题,就这样解决了。

【讨论】:

  • 嗯,所以你正在创建一个关于过去发生的事件的新通知,一遍又一遍。这很聪明。不过,我认为对于大多数其他情况而言,单个正在进行的事件通知将是一个更好的解决方案。
  • mmmm 是 Long 类型...您可以转换为 int,但在 > 5.0 版本中始终打开,2012 有效,但在 2015 中无效!抱歉已弃用
  • 我很高兴找到解决我遇到的确切问题的方法。但是......不幸的是我无法理解这么简单的答案:(。我只是无法理解这一点...... previousTimestamp - 取自哪里?它是给上一个通知的时间戳更新了,还是同一通知的先前更新时间或它是什么?有人可以澄清一下吗?
  • @Liphtier - 原始通知的时间戳。只要您使用相同的时间戳,通知就会保留其在队列中的位置。
  • @Vaiden - 我尝试了这个但没有成功,似乎解决方案已经过时了。至少在 API >=21 的情况下,通知 when 值默认为开始时间,因此手动将其设置为相同没有任何效果。它不影响通知顺序。但是,我发现设置高优先级 - 这就是让通知发挥越级作用的原因,它们已经覆盖了每个人的优先级
【解决方案2】:

您不应继续发送通知。只需使用正在进行的事件标志,就像您在代码中已有的那样。其他通知可能会进入并掩盖您的通知,但这正是 Android 的工作方式。

【讨论】:

  • 我必须每隔几秒重新发送一次通知,因为它是当前运行的应用程序列表,需要更新。我只希望列表位于固定位置(不一定是最顶层),这样用户就不必每次想要使用它时都搜索它。
  • 嗯,Android 中似乎没有办法实现所需的行为。所以这个答案似乎是最合适的。
  • 其实有一个解决方案,至少对我有用。请在本页底部查看我的回答。
【解决方案3】:

您是每次都发送新通知,还是更新现有通知?可以发一下代码吗?

与此同时,您通常可以通过思考“等等,如果两个或多个程序都试图将它们的通知第一?”并意识到程序之间会发生军备竞赛,因为它们会更加努力地确保他们的通知是第一位的,这就是为什么不支持此类功能的原因。

【讨论】:

  • Nik 是正确的 - 如果每个开发者都可以他们的应用显示通知高于其他人,那他们为什么不呢?
  • 一个静态位置就足够了,它不必位于列表的最顶端 - 尽可能高。
  • 我不知道如何在不使用相同 ID 重新发送现有通知的情况下“更新”现有通知,所以这基本上是我每三秒做一次...我将在问题中发布代码.
  • 但是,如果您愿意不成为第一个,而只是拥有一个静态的位置,那么一个不会“窃取第一点”的解决方案将是可行的(并且是问题的答案)。所以“如果会发生什么”的答案是:他们会在列表中获得一个随机(但静态)的位置。
  • 是的,静态位置就足够了。
【解决方案4】:

我已经有一段时间没有为 Android 编写代码了,但如果我没记错的话,每当您拨打 NotificationManager.notify() 时,都是因为您希望通过图标移动或闪烁来提醒用户。但是,有一些方法可以修改您发送的实际通知。

如果有帮助,您也可以致电.cancel()

这里是用于帮助的 Android API 文档,尽管您可能已经看过它们:

Notification

NotificationManager

希望有所帮助!

【讨论】:

  • 抱歉,我没有找到任何关于实际“更新”正在运行的通知的信息。用新内容重新发送(即调用 notify())是我知道的唯一方法......
【解决方案5】:

有一个正在进行的事件标志。 http://developer.android.com/reference/android/app/Notification.html#FLAG_ONGOING_EVENT

您不需要 Notification.FLAG_NO_CLEAR 标志。

【讨论】:

  • 如您所见,我已经在代码中使用了 FLAG_ONGOING_EVENT。问题是,例如下载进度条也使用它,因此在正在进行的区域中每隔几秒切换一次。不过,您可能对 FLAG_NO_CLEAR 标志是正确的 - 尽管它不能解决我的主要问题,但必须对此进行测试。
  • FLAG_ONGOING_EVENT 仅表示 Android 不会关闭通知。它与订购无关
【解决方案6】:

您说您的通知会显示当前正在运行的应用程序列表。为什么每 3 秒重新发送一次通知?为什么不仅在应用列表发生更改时才重新发送通知。这并不能直接解决您的问题,但会大大减少问题。

【讨论】:

  • 你说得对——我已经实现了这样的功能,但目前它并没有按预期工作。因此,我暂时切换回 3 分钟解决方案。然而,正如你所说,这并不能真正解决我的一般问题......
【解决方案7】:

通过将setSortKey(String sortKey) 添加到您的通知构建器,您可以让您的通知保持不变的字典/字母顺序。

【讨论】:

  • 这应该是正确的答案,因为其他的已经过时了。
【解决方案8】:

只是给遇到此问题的其他人的说明 -

Vaiden 的回答解决了我正在进行的通知不断跳跃的问题。出于某种原因,它只发生在我们在 ICS 4.0.3 上的应用程序中,我认为这是由于 ICS 处理通知的方式与旧版本不同。还要注意 - 在平板电脑上,没有像旧版本(姜饼)那样的“持续”与正常通知部分。订单保持不变,只是没有分类。不确定它是否适用于 ICS 上的手机。

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    相关资源
    最近更新 更多