2

создать PendingIntent вроде этого:Намерение дополнительных утрачиваются с трансляцией PendingIntent и AlarmManager.setAlarmClock()

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 получает Intent в onReceive в нужное время. Однако этот Intent не содержит дополнительных функций, которые я установил. Например, intent.getParcelableExtra(EXTRA_ALARM) возвращает null.

Эта проблема возникает, по крайней мере, с Android 7.0 (API level 24), используя LG G5.

Использование FLAG_CANCEL_CURRENT или FLAG_ONE_SHOT не работает.

ответ

6

Переменная сигнала тревоги является условной.

It is not safe to put a custom Parcelable in an Intent that is delivered to another process. Это особенно верно в отношении AlarmManager на Android 7.0.

Вам необходимо заменить это Parcelable чем-то другим, например byte[], где you manually convert your Parcelable to/from that byte[].

+0

Благодарим за внимание. Я буду исследовать. –

+0

Я только что протестировал его, и вы действительно были правы! Преобразование в байт [] работает. Большое спасибо. –

+0

При необходимости онлайновые посчитанные конвертеры не будут работать, если и до тех пор, пока они не преобразут пакет в байт []. –

Смежные вопросы