Android待处理的意图通知问题


74

我的应用程序中发生了一件令人震惊的事情,它启动了一个通知,然后在按下时启动了一个活动。问题在于,当我创建多个警报时,从通知启动的活动将获得与第一个警报相同的附加功能。我认为问题出在我放在待定意图中的意图还是待定意图本身中。我想我可能需要在其中之一上标记,但我不知道哪一个。

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,从而使其具有唯一性。

Answers:


71

问题是,当我创建多个警报时,从通知启动的活动将获得与第一个警报相同的附加功能。

正确。

我如何才能启动正确的意图?

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

如果没有,您可以使用FLAG_ONE_SHOT或其他PendingIntent标志之一来让您的第二个PendingIntent使用较新的附加功能。

但是,如果您一次注册了两个带有不同Intent附加功能的警报,则需要使两者的Intents实质性不同,以便在比较两者时filterEquals()返回false。例如,您可以调用setData()setAction()为每个提供不同的值Intent


2
男人非常感谢您的帮助。因为可能会同时发出警报,并且在通知栏上有多个通知,所以我将FLAG_UPDATE_CURRENT标志用于挂起的意图。但是真正的交易就像您说过的那样对带有警报名称的意图进行setAction,现在它可以知道哪些意图不同,什么相同。再次感谢!
spagi 2010年

2
setAction也为我工作。我只是想知道为什么官方的SDK没有提到它。
Roman Royter 2011年

setAction可以工作,谢谢。使用setAction可以使我区分所有未决的Intent,真是太棒了!
苏厄姆

使用setAction为每个内容Intent设置不同的Action对我来说是关键。非常感谢!
ChristianGarcía2012年

2
创建带有哈希的未决意图时,您还可以使用其他请求代码,这比使用setData更为方便,甚至更干净
Snicolas 2013年

121

解决此问题的方法是,在获得PendingIntent时分配一个唯一的requestCode

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

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

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

9
到目前为止,requestCode确实还没有被任何人使用,但是它确实使意图变得唯一,从而阻止了它们的覆盖!出色的工作u-ramos!
Kitteh 2012年

1
即使TaskStackBuilder正在使用,我们也有一个方法。getPendingIntent(int requestCode, int flags)这里可以将requestID传递给它。
Abdullah Shoaib 2013年

3
请注意,currentTimeMillis的类型为long,因此如果将其强制转换为int,它将被截断。我不知道这有多大可能,是否重要,但可以重复。在这种情况下,您可以使用静态的增量值
djpeinado 2014年

很好的解决方案。今天,我才知道什么requestCode是
Bibaswann Bandyopadhyay

谢谢!完美的解决方案!
ruclip '16

0

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

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

0

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

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

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

-1

另一个解决方案:

像这样使用PendingIntent.FLAG_UPDATE_CURRENT

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

这对我有用


2
这行不通。它替换了旧参数,并替换了新参数
Bibaswann Bandyopadhyay
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.