【发布时间】:2019-09-05 04:25:56
【问题描述】:
我正在尝试将自定义数据类对象从前台服务传递到 BroadcastReceiver。我尝试过使用 Parcelable、Parcelize 和 Serializable,但 BroadcastReceiver 意图总是将其报告为 null。
我浪费了几天时间寻找答案,并查看了这里和其他地方的一些主题。对其他人有效的公认答案对我无效。
这里是服务:
class MyService : Service(){
............
<Some code that initialises alarmTimeInMillis>
............
private fun sendDataToReceiver(){
val intentMyRcvr : Intent = Intent("Data", null, this, MyReceiver::class.java)
intentMyRcvr.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
val bundle = Bundle()
val myParcel = MyParcel(dataP.Id, dataP.Location, dataP.Title, dataP.Description, dataP.Type)
bundle.putParcelable("MyParcel", MyParcel)
intentMyRcvr.putExtras(bundle)
val pendingIntentMyRcvr= PendingIntent.getBroadcast(this, dataP.Id, intentMyRcvr, PendingIntent.FLAG_UPDATE_CURRENT)
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.setWindow(AlarmManager.RTC_WAKEUP, alarmTimeInMillis, 5 * 60 * 1000, pendingIntentMyRcvr)
}
}
这是广播接收器:
class MyRcvr : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == "Data") {
val bundle = intent.getBundleExtra("MyParcel")
val myParcel = bundle.getParcelable<MyParcel>("MyParcel")
val intentToService = Intent("Data", null, context, MyService::class.java)
if (myParcel != null) {
intentToService.putExtra("MyParcel", MyParcel)
context.startService(intentToService)
}
}
}
}
这是 Parcelize 数据类:
@Parcelize
data class MyParcel(
var Id: Int = 0,
var Location: String,
var Title: String,
var Description: String,
var Type: String,
) : Parcelable
我也尝试过不使用 Bundle,即直接传递 parcelable 对象。两者都不会在服务中产生任何错误,但是接收方总是将其报告为 null。我已经包含了来自 logcat 的堆栈跟踪:
4081-4081/a.b.c E/AndroidRuntime: 致命异常: main 进程:a.b.c,PID:4081 java.lang.RuntimeException:无法启动接收器 a.b.c.AlarmsRcvr:java.lang.NullPointerException:尝试调用 虚拟方法'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' 在一个空对象上 参考 在 android.app.ActivityThread.handleReceiver(ActivityThread.java:3389) 在 android.app.ActivityThread.access$1200(ActivityThread.java:200) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1662) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:6680) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 引起:java.lang.NullPointerException:尝试调用虚拟方法'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' 在一个空对象上 参考 在 a.b.c.MyRcvr.onReceive(MyRcvr.kt:21) 在 android.app.ActivityThread.handleReceiver(ActivityThread.java:3380) 在 android.app.ActivityThread.access$1200(ActivityThread.java:200) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1662) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:6680) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
我开始怀疑这是否是最新 SDK 或 Kotlin 插件中的错误。有什么想法我可能做错了吗?
【问题讨论】:
-
Android Studio 版本 - 3.5.0
-
Gradle 版本 - 5.4.1,API 28,Kotlin - 1.3.50
标签: android kotlin-android-extensions