对AlarmManager.setRepeating的多次调用提供了相同的Intent / PendingIntent额外值,但我提供了不同的值

时间:2010-05-16 15:22:55

标签: android android-pendingintent extras alarms

在撰写此问题时解决,但发布以防万一:

我正在设置多个此类警报,其值为id

AlarmManager alarms = (AlarmManager)context.getSystemService(
        Context.ALARM_SERVICE);
Intent i = new Intent(MyReceiver.ACTION_ALARM);  // "com.example.ALARM"
i.putExtra(MyReceiver.EXTRA_ID, id);  // "com.example.ID", 2
PendingIntent p = PendingIntent.getBroadcast(context, 0, i, 0);
alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextMillis, 300000, p);  // 5 mins

......然后像这样接收它们:

public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(ACTION_ALARM)) {
        // It's time to sound/show an alarm
        final long id = intent.getLongExtra(EXTRA_ID, -1);

警报会在正确的时间传递给我的接收器,但通常会将EXTRA_ID设置为错误的值:这是我在某个时候使用过的值,而不是我想要的那个值。特定的时间。

3 个答案:

答案 0 :(得分:24)

PendingIntent.getBroadcast()的文档说:

  

<强>返回

     

返回与给定参数匹配的现有或新PendingIntent。

问题在于,只有额外内容不同的两个Intent似乎与此目的相匹配。所以getBroadcast()将返回一些随机的旧PendingIntent(使用不同的EXTRA_ID)而不是我刚创建的Intent周围的新PendingIntent。修复是提供数据Uri并使其与id不同,如下所示:

Intent i = new Intent(MyReceiver.ACTION_ALARM, Uri.parse("timer:"+id));

然后您可以使用以下方式检索身份证号码:

Long.parseLong(intent.getData().getSchemeSpecificPart());

......或者当然也提供额外的东西并使用它。

答案 1 :(得分:7)

您还可以使用标记PendingIntent.FLAG_UPDATE_CURRENT

PendingIntent p = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

这应该是工作

答案 2 :(得分:2)

您的问题的解决方案是使用Intent.FLAG_ACTIVITY_NEW_TASK

  p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);