【问题标题】:android pending intent notification problemandroid挂起的意图通知问题
【发布时间】:2010-06-09 19:11:52
【问题描述】:

我的应用程序中发生了警报,它会启动一个通知,然后在按下该通知时会启动一个活动。 问题是,当我创建多个警报时,从通知启动的活动会获得与第一个警报相同的附加功能。我认为问题在于我放入待处理意图的意图或待处理意图本身。我想我可能需要在其中一个上加个标志,但我不知道是哪一个。

Intent showIntent =new Intent(context, notificationreceiver.class);
    showIntent.putExtra("details", alarmname);

PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
        showIntent, 0); 

    notification.setLatestEventInfo(context, "The event is imminent",
            alarmname, contentIntent);

以及通知的接收者

Bundle b = getIntent().getExtras();
    String eventname = b.getString("details");
    details.setText(eventname);

每次下一次通知发生时,额外的“详细信息”都是相同的,而不是具有不同的值。 在我设置意图之前,我确信正确的值会出现在“详细信息”中,因此每次按下任何通知时都会出现第一个意图的问题。 我怎样才能让它启动正确的意图? 希望我尽可能清楚 谢谢!

【问题讨论】:

  • 我所做的是因为我使用唯一的 notificationId 来跟踪状态(状态栏通知),我使用相同的变量传递到我的 PendingIntent 从而使其独一无二。

标签: android notifications android-intent


【解决方案1】:

我解决该问题的方法是在您获得 PendingIntent 时分配一个唯一的 requestCode

PendingIntent.getActivity(context, requestCode, showIntent, 0); 

通过这样做,您正在向系统注册不同/唯一的意图实例。 提示: 使 requestCode 唯一的一种好方法是将当前系统时间传递给它。

int requestID = (int) System.currentTimeMillis();

【讨论】:

  • requestCode 确实还没有被任何东西使用,但它确实使意图独一无二,从而阻止它们被覆盖!出色的工作 u-ramos!
  • 即使使用TaskStackBuilder,我们也有一个方法getPendingIntent(int requestCode, int flags)。这里可以传递这个requestID。
  • 小心,currentTimeMillis 是 long 类型,所以如果你转换为 int,它将被截断。我不知道可能性有多大以及是否重要,但它可以重复。在这种情况下,您可以使用静态递增值
  • 很好的解决方案。今天才知道requestCode是干什么用的
  • 谢谢!完美的解决方案!
【解决方案2】:

问题是当我创建更多 比一个警报然后是活动 从通知启动获取 与第一个相同的附加功能。

正确。

我怎样才能让它启动 意图正确吗?

这取决于您是否有两个将同时注册的警报。

如果没有,您可以use FLAG_ONE_SHOT or one of the other PendingIntent flags 让您的第二个PendingIntent 使用更新的附加功能。

但是,如果您将同时注册两个警报,并且具有不同的Intent extras,则需要使两个Intents 在本质上有所不同,以便filterEquals() 在比较两者时返回false二。例如,您可以调用setData()setAction() 并为每个Intent 提供不同的值。

【讨论】:

  • 非常感谢您的帮助。因为有可能同时发生警报并且在通知栏上有多个通知,所以我将 FLAG_UPDATE_CURRENT 标志用于未决意图。但真正的交易就像你所说的那样,在带有警报名称的意图上设置操作,现在它可以知道哪些意图不同,哪些相同。再次感谢!
  • setAction 也对我有用。我只是想知道为什么官方SDK没有提到它。
  • setAction 有效,感谢 TON。使用 setAction 帮助我区分了所有的 pendingIntent,太棒了!
  • 使用 setAction 为每个内容设置不同的操作 Intent 对我来说很关键。非常感谢!
  • 您还可以在创建待处理意图时使用不同的请求代码,使用哈希,这非常方便,并且可能比使用 setData 更清洁
【解决方案3】:

我在我的应用程序中遇到了这个问题,只是生成了一个随机数来覆盖通知意图:

int random= new Random().nextInt();
PendingIntent resultPendingIntent =
      stackBuilder.getPendingIntent(
              random,
              PendingIntent.FLAG_UPDATE_CURRENT
      );

【讨论】:

    【解决方案4】:

    我遵循了 U-ramos 提供的解决方案,这对我有用

    int requestID = (int) System.currentTimeMillis();
    
    PendingIntent pendingIntent = PendingIntent.getActivity(this, requestID, showIntent, 0);
    

    【讨论】:

      【解决方案5】:

      另一种解决方案:

      像这样使用 PendingIntent.FLAG_UPDATE_CURRENT

      PendingIntent contentIntent = PendingIntent.getActivity(this, 0,i, PendingIntent.FLAG_UPDATE_CURRENT);
      

      这对我有用

      【讨论】:

      • 这不起作用。它替换旧参数并替换为新参数
      猜你喜欢
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      相关资源
      最近更新 更多