Android 悄悄地更新正在进行的通知

Android 悄悄地更新正在进行的通知,android,notifications,android-3.0-honeycomb,Android,Notifications,Android 3.0 Honeycomb,我有一个无线连接到其他设备的服务。当服务启用时,我会收到一个持续的通知,说明它已启用 启用服务后,用户将连接到另一个设备。此时,我想更新我正在进行的通知,以说明已连接到的设备的名称。通过再次调用startForeground(持续的通知,通知)和更新的信息,这很容易做到;但是,每次调用时,都会在工具栏上闪烁通知。我真正想要的是通知在后台悄悄更新,而不在通知栏上闪烁,这样用户在打开通知区域查看之前不会知道区别 是否有办法在不调用startForeground()的情况下更新通知 这种行为只发生在蜂

我有一个无线连接到其他设备的服务。当服务启用时,我会收到一个持续的通知,说明它已启用

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

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


这种行为只发生在蜂巢中。姜饼设备(我认为Froyo等)的行为符合要求。

您应该更新现有通知

我也遇到过这个问题,在前面的评论和挖掘的帮助下,我找到了解决方案

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

  • 在生成器上使用setonlylertonce(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),它将更新通知而不会打扰用户。

这对我来说很有效,正在进行的活动(而不是服务)通知将“无声”更新

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 );
试试这个

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

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

调用
notify()
时的行为与我调用
startForeground()
时的行为相同@howettl您已经尝试过了吗?它的行为可能会有所不同。。如果这对你没有帮助的话,你可以试试。在回答之前,我确实试过你的第一个建议。您的第二个建议使我在Notification类中找到了标志\u ONLY\u ALERT\u ONCE,这导致了正确的行为。谢谢@你怎么能分享你的代码?我也有同样的问题,闪烁通知和FLAG_ONLY_ALERT_ONCE不起作用如果setTicker(CharSequence)被调用,Android似乎忽略了FLAG_ONLY_ALERT_ONCE标志,所以如果你只是想更新通知,请确保没有设置ticker文本。我不同意这种评估。状态栏中显示的是股票代码文本。从我的实验中,我可以得出结论,如果:1。setonlylertonce(true)被设置(我们同意这一点)2。setTicker(字符序列)未设置为3。通知id是相同的,因为每次更新都不需要使用相同的生成器。+1表示相同的生成器很重要(在文档中找不到)。我自己也试过:当通知抽屉关闭时,没有区别。但是,如果在用户打开通知时发生更新,通知会消失几分钟,这会产生令人不快的闪烁。使用相同的生成器神奇地解决了这个问题。(在4.1.2上测试)谢谢,这很好。我使用progress==0,因为它更容易实现。为meTimestamps所做的相同构建器始终是唯一的。不可能有相同的时间戳。你认为如果你连续三次调用getTimeInMillis,你会得到三个不同的号码吗?一毫秒是很长的时间;你会看到很多,许多重复。也考虑截断一个纪元毫秒到整数大小肯定不会是唯一的一个持续的通知,持续数天。如果您想要一个唯一的ID(尽管与原始问题无关),那么最好从SharedReferences中检索一个整数,并在检索时将其递增。谢谢,
setonlylertonce(true)
正是我需要更改通知中的操作按钮,而不是重新创建(隐藏/显示)一个新通知的原因。几个小时来一直在看API,但没有意识到我需要的是这种方法。