发送包含 PendingIntent 的 Bundle 到广播接收器时出现问题,数据丢失。

13

我正在通过使用AlarmManager和BroadcastReceiver类(名为AReceiver.java)为我的程序添加一些基本的闹钟功能。我的问题是,我添加到创建PendingIntent的意图附加的bundle中的数据似乎丢失了。在AReceiver类中我只能访问一个android.intent.extra.ALARM_COUNT=1的Bundle数据。

这里是在主活动类中创建Intent、PendingIntent和AlarmManager的基本代码: [主活动中的代码-Notepadv3]

Intent intent = new Intent(Notepadv3.this, AReceiver.class);         
intent.putExtra("teststring","hello, passed string in Extra");               
PendingIntent alarmIntent = PendingIntent.getBroadcast(this, pendingPeriodIntentId, intent, 0);     
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);           
am.set(AlarmManager.RTC_WAKEUP, timeOfNextPeriod.getTimeInMillis(), alarmIntent);

[在广播接收器中的代码 - AReceiver]

public void onReceive(Context con, Intent arg1) {
Bundle extrasBundle = arg1.getExtras();
Log.d("broadcast","contains teststring = " + extrasBundle.containsKey("teststring"));
Log.d("broadcast","is empty? = " + extrasBundle.isEmpty());
Log.d("broadcast","to string = " + extrasBundle.toString());
    }   

调试信息显示contains teststring为FALSE,is empty为FALSE,当输出整个bundle时,我得到了android.intent.extra.ALARM_COUNT=1的值。

非常感谢任何帮助。

干杯, Tom

1个回答

35

你需要更改这一行

PendingIntent alarmIntent = PendingIntent.getBroadcast(this, pendingPeriodIntentId, intent, 0);

变成这样

PendingIntent alarmIntent = PendingIntent.getBroadcast(this, pendingPeriodIntentId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
否则数据将丢失。

谢谢!那就是解决方法,我已经四处搜寻以获取正确的参数。再次感谢。 - Tom Gustafson
奇怪的是,在Android 4.0.3模拟器上,它可以使用0和PendingIntent.FLAG_UPDATE_CURRENT两种方式运行。 - max4ever
2
但是... 当你执行后者时,它会覆盖任何现有的额外内容。这意味着如果我们想要添加新的额外内容并保留现有的额外内容,它就不起作用了。通常将0作为标志传递会导致此操作成功(例如,如果在PendingIntent上调用send而不是使用AlarmManager进行调度)。这是怎么回事? - Michael
3
即使在Android 4.4.2上将标志设置为0,我仍然可以从Intent中检索extras,而在Android 5上,即使使用FLAG_UPDATE_CURRENT,extras也会丢失。 - a.dibacco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接