Intent extra 在广播 PendingIntent 和 AlarmManager.setAlarmClock() 时丢失
Intent extras are lost with a broadcast PendingIntent and AlarmManager.setAlarmClock()
我创建了一个 PendingIntent
这样的:
Intent intent = new Intent(context, AlarmReceiver.class);
intent.setAction("Foobar");
intent.putExtra(EXTRA_ALARM, alarm);
intent.putExtra(EXTRA_TRYTWO, tryTwo);
intent.putExtra(EXTRA_BEGAN_TIME, beganTime);
return PendingIntent.getBroadcast(
context, (int) alarm.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT
);
alarm
变量是 Parcelable
。我这样安排 PendingIntent
:
PendingIntent alarmModifyPendingIntent = PendingIntent.getActivity(
context, 0, editIntent, PendingIntent.FLAG_CANCEL_CURRENT
);
am.setAlarmClock(
new AlarmManager.AlarmClockInfo(time, alarmModifyPendingIntent), pendingIntent
);
其中创建变量pendingIntent
如上所示。
AlarmReceiver
对象在正确的时间在 onReceive
中接收到 Intent
。但是,这个 Intent
不包含我设置的额外内容。例如intent.getParcelableExtra(EXTRA_ALARM)
returns null
.
这个问题至少出现在 Android 7.0(API 24 级),使用 LG G5。
使用 FLAG_CANCEL_CURRENT
或 FLAG_ONE_SHOT
也不起作用。
The alarm variable is a Parcelable.
It is not safe to put a custom Parcelable
in an Intent
that is delivered to another process。 Android 7.0.
上的 AlarmManager
尤其如此
您需要将 Parcelable
替换为其他内容,例如 byte[]
,其中 you manually convert your Parcelable
to/from that byte[]
.
我创建了一个 PendingIntent
这样的:
Intent intent = new Intent(context, AlarmReceiver.class);
intent.setAction("Foobar");
intent.putExtra(EXTRA_ALARM, alarm);
intent.putExtra(EXTRA_TRYTWO, tryTwo);
intent.putExtra(EXTRA_BEGAN_TIME, beganTime);
return PendingIntent.getBroadcast(
context, (int) alarm.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT
);
alarm
变量是 Parcelable
。我这样安排 PendingIntent
:
PendingIntent alarmModifyPendingIntent = PendingIntent.getActivity(
context, 0, editIntent, PendingIntent.FLAG_CANCEL_CURRENT
);
am.setAlarmClock(
new AlarmManager.AlarmClockInfo(time, alarmModifyPendingIntent), pendingIntent
);
其中创建变量pendingIntent
如上所示。
AlarmReceiver
对象在正确的时间在 onReceive
中接收到 Intent
。但是,这个 Intent
不包含我设置的额外内容。例如intent.getParcelableExtra(EXTRA_ALARM)
returns null
.
这个问题至少出现在 Android 7.0(API 24 级),使用 LG G5。
使用 FLAG_CANCEL_CURRENT
或 FLAG_ONE_SHOT
也不起作用。
The alarm variable is a Parcelable.
It is not safe to put a custom Parcelable
in an Intent
that is delivered to another process。 Android 7.0.
AlarmManager
尤其如此
您需要将 Parcelable
替换为其他内容,例如 byte[]
,其中 you manually convert your Parcelable
to/from that byte[]
.