使用广播PendingIntent和AlarmManager.setAlarmClock()丢失意图附加信息

Mat*_*ell 3 android android-intent android-alarms android-pendingintent android-broadcast

我创建了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
);
Run Code Online (Sandbox Code Playgroud)

alarm变量是一个Parcelable.我这样安排PendingIntent:

PendingIntent alarmModifyPendingIntent = PendingIntent.getActivity(
        context, 0, editIntent, PendingIntent.FLAG_CANCEL_CURRENT
);

am.setAlarmClock(
    new AlarmManager.AlarmClockInfo(time, alarmModifyPendingIntent), pendingIntent
);
Run Code Online (Sandbox Code Playgroud)

pendingIntent如上所示创建变量的位置.

AlarmReceiver对象接收IntentonReceive在正确的时间.但是,这Intent不包含我设置的额外内容.例如intent.getParcelableExtra(EXTRA_ALARM)返回null.

Android 7.0(API级别24)至少使用LG G5会出现此问题.

使用FLAG_CANCEL_CURRENTFLAG_ONE_SHOT不工作.

Com*_*are 8

警报变量是Parcelable.

将自定义Parcelable放入Intent传递给另一个进程的自定义是不安全的.AlarmManager在Android 7.0上尤其如此.

您需要将其替换Parcelable为其他内容,例如a byte[],您手动将其转换Parcelable为/从该转换byte[].