2010-06-09 84 views
72

我的应用程序中有一个闹钟事件,它会启动一个通知,然后当按下时启动一个活动。 问题是,当我创建多个警报时,从通知启动的活动获得与第一个相同的额外资源。我认为这个问题要么是出于意图,而是出于待决意图或待决意图本身。我想我可能需要在其中的一个上放一个标志,但我不知道哪一个。android等待意图通知问题

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); 

“详细资料”的接收额外是相同的,下一次的通知发生,而不是具有不同价值的每一个。 直到我设定意图,我相信正确的价值去“细节”,所以它每次我按任何通知时获得第一个意图的问题。 我如何才能启动正确的意图? 希望我尽可能清楚 谢谢!

+0

我做了什么因为我使用唯一的notificationId来跟踪状态(状态栏通知),所以我使用相同的变量传入我的PendingIntent中,从而使其具有唯一性。 – 2011-08-16 22:11:48

回答

68

的问题是,当我创造更多 多个报警,然后从通知发布活动 得到 同为演员的第一个。

正确。

我该如何使其启动 正确的意图?

这取决于您是否有两个报警将立即注册或不存在。

如果不是,您可以use FLAG_ONE_SHOT or one of the other PendingIntent flags让您的第二个PendingIntent使用更新的演员。

但是,如果你将有一次注册了两个报警器,具有不同的Intent演员,你将需要两个Intents比较两个时更加重大差异,使得filterEquals()回报false。例如,您可以拨打setData()setAction(),并为每个Intent提供不同的值。

+2

男士非常感谢您的帮助。因为可能有警报在一起,并且在通知栏上有多个通知,所以我使用FLAG_UPDATE_CURRENT标志作为挂起的意图。 但是,真正的交易就像你说的用行动警报名称设置行动的意图,现在它可以知道哪些意图是不同的以及相同的意图。 再次感谢! – spagi 2010-06-10 00:42:57

+2

setAction也适用于我。我只是想知道为什么官方的SDK没有提到它。 – 2011-01-23 05:07:21

+0

setAction的作品,谢谢TON。使用setAction帮助我区分所有pendingIntents,非常棒! – Soham 2011-11-03 06:54:48

116

我解决了这个问题的方法是通过分配一个唯一的requestCode当你得到的PendingIntent:

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

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

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

requestCode确实没有被任何东西使用,但它确实使意图具有唯一性,从而避免它们被覆盖!优秀的工作u-ramos! – Kitteh 2012-01-17 11:55:50

+1

即使使用了'TaskStackBuilder',我们也有一个方法'getPendingIntent(int requestCode,int flags)'。这里可以传递这个requestID。 – 2013-11-11 07:20:09

+1

小心,currentTimeMillis类型是long,所以如果你转换为int,它将被截断。 我不知道有多可能,如果有关系,但可以重复。 在这种情况下,您可以使用静态递增值 – djpeinado 2014-02-06 13:36:59

1

另一种解决方案:

使用的PendingIntent。FLAG_UPDATE_CURRENT这样的:

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

这个工作对我来说

+0

这不起作用。它取代了旧的参数并取代了新的参数 – 2015-10-12 19:49:16

0

我在我的应用程序有这个问题,只是产生的随机数超过来重写通知意向:

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