我想启动警报并将对象传递给将由触发警报的BroadcastReceiver子类接收的意图,但是无论我传递给Intent的什么内容,都将不会保存,接收到的Intent将为null < / p>
这是我的代码:
(设置闹钟):
private void startAlarm() {
Girafe girafe = new Girafe("holly");
int hash = 1
// set the date of the alarm to be in one minute
Calendar c = Calendar.getInstance();
c.add(Calendar.MINUTE, 1);
// Create the alarm
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlertReceiver.class);
// I pass here the object I want to be received on alarm fired
intent.putExtra("myObject", girafe);
intent.putExtra("myStr", "hello");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, hash, intent, 0);
alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
}
(接收和触发警报):
public void onReceive(Context context, Intent intent) {
String myStr = intent.getStringExtra("myStr") // I receive something null here
Girage g = (Girafe) intent.getSerializableExtra("myObject"); // same here
}
问题出在哪里?
PS:我知道这个问题已于7个月前在这里Intent getting null in onReceive in MyAlarm class even though I sat putExtra while sending intent提出,但没有人解决。
答案 0 :(得分:0)
这不起作用。如果您传递了一个自定义对象(即:Android不知道的对象),则AlarmManager
无法反序列化该对象,因此该对象将被忽略。这就是为什么在触发警报时您永远都不会在“ extras”中看到对象的原因。
要解决此问题,您可以将对象序列化为byte
数组或String
并将其放在“ extras”中。 AlarmManager
知道byte
个数组和String
个数组,因此在触发警报时,您应该在“扩展名”中看到序列化的对象。然后,您将需要反序列化byte
数组或String
并自己重新创建对象。
另一个潜在的问题是您这样做:
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, hash, intent, 0);
此呼叫不一定总是创建新的PendingIntent
。它可能会返回现有 PendingIntent
,其中没有您的“附加”。为确保不会发生这种情况,您应该这样做:
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, hash, intent, PendingIntent.FLAG_UPDATE_CURRENT);
添加FLAG_UPDATE_CURRENT
可以确保将您的“ extras”复制到PendingIntent
中,即使返回现有的“ extras”也是如此。