【问题标题】:Updating an ongoing notification quietly悄悄更新正在进行的通知
【发布时间】:2011-06-20 04:08:38
【问题描述】:

我有一项服务可以无线连接到其他设备。启用该服务后,我会收到一个持续通知,说明它已启用。

服务启用后,用户会连接到另一台设备。此时,我想更新我正在进行的通知以说明已连接到的设备的名称。这很容易通过再次使用更新信息调用startForeground(ONGOING_NOTIFICATION, notification) 来完成;但是,每次调用它时都会在栏上闪烁通知。我真正想要的是通知在后台悄悄更新而不在通知栏上闪烁,这样用户在打开通知区域查看之前不知道区别。

有没有办法在不调用startForeground()的情况下更新通知?

此行为仅发生在 Honeycomb 中。 Gingerbread 设备(我假设 Froyo 等)的行为符合预期。

【问题讨论】:

    标签: android notifications android-3.0-honeycomb


    【解决方案1】:

    我也遇到过这个问题,在以前的 cmets 的帮助下,我已经找到了解决方案。

    如果您不希望通知在更新时闪烁,或不断占用设备的状态栏,您必须:

    • 在构建器上使用 setOnlyAlertOnce(true)
    • 使用相同的生成器 每次更新。

    如果您每次都使用新的构建器,那么我猜 Android 必须重新构建视图,导致它短暂地消失。

    一些好的代码示例:

    class NotificationExample extends Activity {
    
      private NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
      private mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
      //Different Id's will show up as different notifications
      private int mNotificationId = 1;    
    
      //Some things we only have to set the first time.
      private boolean firstTime = true;
    
      private updateNotification(String message, int progress) {
        if (firstTime) {
          mBuilder.setSmallIcon(R.drawable.icon)
          .setContentTitle("My Notification")
          .setOnlyAlertOnce(true);
          firstTime = false;
        }
        mBuilder.setContentText(message)
        .setProgress(100, progress, true);
    
        mNotificationManager.notify(mNotificationId, mBuilder.build());
      }
    }
    

    使用上面的代码,您只需调用带有消息和进度(0-100)的 updateNotification(String, int),它就会更新通知而不会惹恼用户。

    【讨论】:

    • 我不同意这个评估。状态栏中显示的是代码文本。从我的实验中,我可以得出结论,如果出现以下情况,则不会显示代码: 1. setOnlyAlertOnce(true) 已设置(我们同意这一点) 2. setTicker(CharSequence) 未设置 3. 通知 ID 相同 IMO 不需要为每次更新使用相同的构建器。
    • +1 指出同一个构建器很重要(在文档中找不到)。自己试了一下:当通知抽屉关闭时没有区别。但是,如果在用户打开通知时发生更新,则通知会消失片刻,这会产生令人不快的闪烁。使用相同的构建器神奇地解决了这个问题。 (在 4.1.2 上测试)
    • 感谢这很好用。我使用 progress==0 是因为它更容易实现。
    • 同一个建造者为我做的
    【解决方案2】:

    【讨论】:

    • 调用notify() 时的行为与调用startForeground() 时的行为相同。
    • @howettl 你试过了吗?它的行为可能会有所不同.. 如果这没有帮助,您可以尝试 developer.android.com/reference/android/app/…
    • 在回复之前我确实尝试了您的第一个建议。您的第二个建议使我找到了 Notification 类中的 FLAG_ONLY_ALERT_ONCE 标志,这导致了正确的行为。谢谢!
    • @howettl 你能分享你的代码吗?我在闪烁通知时遇到同样的问题,并且 FLAG_ONLY_ALERT_ONCE 不起作用
    • 如果调用 setTicker(CharSequence),Android 似乎会忽略 FLAG_ONLY_ALERT_ONCE 标志,因此如果您只想更新通知,请确保未设置代码文本。
    【解决方案3】:

    这对我有用,因此正在进行的活动(不是服务)通知会“静默”更新。

    NotificationManager notifManager; // notifManager IS GLOBAL
    note = new NotificationCompat.Builder(this)
        .setContentTitle(YOUR_TITLE)
        .setSmallIcon(R.drawable.yourImageHere);
    
    note.setOnlyAlertOnce(true);
    note.setOngoing(true);
    note.setWhen( System.currentTimeMillis() );
    
    note.setContentText(YOUR_MESSAGE);
    
    Notification notification = note.build();
    notifManager.notify(THE_ID_TO_UPDATE, notification );
    

    【讨论】:

    • 谢谢,setOnlyAlertOnce(true) 正是我需要更改通知中的操作按钮并且它不会重新创建(隐藏/显示)新通知。看了几个小时的 API 并没有意识到我需要这个方法。
    【解决方案4】:

    试试这个

        int id = (int) Calendar.getInstance().getTimeInMillis();
    

    在 notify() 方法中使用此 id。您的 Android 系统本身的时间会创建一个唯一的 ID

    【讨论】:

    • 时间戳总是唯一的。不能有相同的时间戳。
    • 你认为如果你连续调用 getTimeInMillis 三次,你会得到三个不同的数字?一毫秒是一个long的时间;你会看到很多很多的重复。
    • 还要考虑到以毫秒为单位将纪元截断为整数大小肯定不会是唯一的,持续通知持续数天。如果您想要一个唯一 ID(尽管与原始问题无关),那么最好从 SharedPreferences 中检索一个整数并在检索时将其递增。
    猜你喜欢
    • 2011-10-30
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2019-02-17
    • 2018-03-26
    相关资源
    最近更新 更多