Android AlarmManager 和 BroadcastReceiver 清空意图数据



我发现Android O上有些地方出错。我已经完成了Reminder功能的实现。我想在固定时间发送广播。AlarmManager工作正常,BroadcastReceiver执行onReceive但意图没有数据。我已经检查了所有内容,并且在设置警报数据时附加到意图中。我认为过去它运作良好,在此期间发生了一些事情。以下是显示我如何设置IntentPendingIntent和警报的代码。

Intent(context, AlarmReceiver::class.java).apply {
action = System.currentTimeMillis().toString()
putExtra(AlarmService.ID_KEY, alarmId)
putExtra(AlarmService.CONTENT_TASK, task)
putExtra(AlarmService.CONTENT_ID, task.localId.value)
putExtra(AlarmService.CONTENT_STATUS, task.status)
putExtra(AlarmService.CONTENT_TITLE_KEY, notificationTitle)
putExtra(AlarmService.MESSAGE_KEY, notificationMessage)
}

待处理的内联网:

private fun createPendingIntent(context: Context, intent: Intent, alarmId: Int): PendingIntent {
return PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}

报警:

alarmManager.set(AlarmManager.RTC_WAKEUP, AppGlobal.getTimeToMilisecond(task.date) - timeAgo, createPendingIntent(context, intent, alarmId))

我还尝试通过将BroadcastReceiver更改为IntentService并将PendingIntent.getBroadcast更改为PendingIntent.getService来触发服务->结果是一样的。onHandleIntent接收到没有数据的Intent。我所说的no data是指例如intent.getStringExtra(AlarmService.CONTENT_STATUS)返回 null。如何解决此问题?

编辑:

我正在考虑改变方法。也许我应该切换到JobScheduler来摆脱这个错误?你对我的想法有什么看法?

编辑2:

事实证明,我的Parcelable对象的序列化存在问题。我有Parcelable子对象,这些子对象在序列化方面存在一些问题。不幸的是,Android O没有通知这一点。我发现了从带O的设备切换到旧设备后的问题是什么。

解决了在清单中以这种方式声明广播接收器的问题

<receiver android:name=".services.AlarmReceiver"
android:enabled="true"
android:exported="false"
>
<intent-filter>
<action android:name="com.blogspot.shudiptotrafder.lifeschedular"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>

自从我以这种方式活动以来打电话

val intent = Intent(context, AlarmReceiver::class.java)
intent.putExtra(ALARM_EXTRA, alarm)
intent.putExtra("1123","Hola mundo!")
val pIntent = PendingIntent.getBroadcast(
context,
112358,
intent,
PendingIntent.FLAG_UPDATE_CURRENT
)
Log.e("1123 time seetteedd",nextAlarm.timeInMillis.toString())
val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
am.set(AlarmManager.RTC_WAKEUP, nextAlarm.timeInMillis, pIntent)

最新更新