17

在写这个问题时解决了,但张贴以防万一它对任何人都有帮助:

我正在设置多个这样的警报,具有不同的值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设置为错误的值:这是我在某个时候使用过的值,而不是我希望在那个特定时间发送的值。

4

3 回答 3

25

的文档PendingIntent.getBroadcast()说:

退货

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

问题是两个仅在额外内容上有所不同的意图似乎与此目的相匹配。因此getBroadcast()将返回一些随机的旧 PendingIntent (带有不同的EXTRA_ID),而不是围绕我刚刚创建的 Intent 的新的。解决方法是提供一个数据 Uri 并使其与 id 不同,如下所示:

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

然后,您可以使用以下方法检索 ID 号:

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

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

于 2010-05-16T15:23:19.147 回答
7

你也可以使用标志PendingIntent.FLAG_UPDATE_CURRENT

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

这也应该工作

于 2011-01-05T09:26:04.277 回答
3

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

  p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
于 2012-01-13T11:21:40.387 回答