除了第一个意图外,所有意图都收到了不正确的额外内容

Posted

技术标签:

【中文标题】除了第一个意图外,所有意图都收到了不正确的额外内容【英文标题】:Incorrect extras received with all intents but the first one 【发布时间】:2010-12-03 18:33:09 【问题描述】:

我有一个小应用程序,可用于设置未来事件的提醒。该应用程序使用 AlarmManager 来设置提醒用户的时间。当闹钟响起时,BroadcastReceiver 会注册它,然后启动服务以通过 toast 和状态栏中的通知通知用户。

为了在通知和 toast 中显示正确的信息,一些额外的信息与意图一起传递。首次注册提醒时,BroadcastReceiver 接收并传递给服务的信息是正确的。但是对于随后的每个提醒(即 BroadcastReceiver 收到的每个新意图),即使发送的信息不同,此信息也会保持不变。

例如,如果字符串“foo”作为第一个意图的额外内容,则广播接收器会正确提取“foo”。如果在第二个意图中添加了“bar”作为额外内容,则 BroadcastReceiver 仍会提取“foo”。

这是注册警报并传递意图的代码(主ui-class):

Intent intent = new Intent(ACTION_SET_ALARM);
intent.putExtra("desc", desc);
intent.putExtra("time", time);
intent.putExtra("dbId", dbId);
intent.putExtra("millis", millis);
PendingIntent pIntent = PendingIntent.getBroadcast(quickAlert.this, 0, intent, 0);

// Schedule the alarm!
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, millis, pIntent);

BroadcastReceiver 类中的 onReceive() 方法:

@Override
public void onReceive(Context context, Intent intent) 

    Intent i = new Intent(context, AlertService.class);

    String desc = intent.getStringExtra("desc").equals("") ? "": ": " + intent.getStringExtra("desc");
    String time = intent.getStringExtra("time");
    long dbId = intent.getLongExtra("dbId", -1);
    long millis = intent.getLongExtra("millis", -1);

    i.putExtra("desc", desc);
    i.putExtra("time", time);
    i.putExtra("dbId", dbId);
    i.putExtra("millis", millis);
    Log.d(TAG, "AlertReceiver: " + desc + ", " + time + ", " + dbId + ", " + millis);

    Toast.makeText(context, "Reminder: " + desc, Toast.LENGTH_LONG).show();
    context.startService(i);

清单中的意图过滤器:

<receiver android:name=".AlertReceiver">
        <intent-filter>
            <action android:name="com.aspartame.quickAlert.ACTION_SET_ALARM" />
        </intent-filter>
    </receiver>

我已经被这个问题困扰了一段时间,非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

当您通过getBroadcast() 创建PendingIntent 时,尝试将FLAG_UPDATE_CURRENT 添加到您的PendingIntent

【讨论】:

【参考方案2】:

以上答案是正确的,但缺乏解释。值得注意的是PendingIntent documentation这部分:

PendingIntent 本身只是对系统维护的令牌的引用,该令牌描述了用于检索它的原始数据。 ...如果创建应用程序稍后重新检索相同类型的 PendingIntent(相同的操作,相同的 Intent 操作,数据,类别和组件,以及相同的标志),它将接收代表相同令牌的 PendingIntent

请注意,“额外”数据具体包含在 PendingIntent-identity 的概念中!

【讨论】:

哇,当我发现这个时,我真的很惊讶。感谢您的解释!你救了我很多头痛。【参考方案3】:

我找到的关于这个主题的最佳链接:http://alvinalexander.com/source-code/android/android-how-attach-extra-intent-pendingintent-notification-solution-example

这是线索:

int uniqueInt = (int) (System.currentTimeMillis() & 0xfffffff);
PendingIntent.getService(context, uniqueInt, intent, 0)

【讨论】:

除此之外,如果你也使用 FLAG_UPDATE_CURRENT 也很好。

以上是关于除了第一个意图外,所有意图都收到了不正确的额外内容的主要内容,如果未能解决你的问题,请参考以下文章

通知中的意图未正确发送到其他活动

来自通知的意图没有额外内容

广播接收器没有收到额外的

如何从 RemoteViewsService 中的意图访问额外内容?

即使重新创建活动,也不会清除待处理的意图额外内容

JavaScript内存示意图