【问题标题】:Passing a custom object to BroadcastReceiver results via intent returns null通过意图将自定义对象传递给 BroadcastReceiver 结果返回 null
【发布时间】: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


【解决方案1】:

改变

   bundle.putParcelable("MyParcel", MyParcel)

   bundle.putParcelable("MyParcel", myParcel)

请注意第二行中的小写“m”。

【讨论】:

  • 这就是我在我的项目中使用它的方式。我在粘贴一些并输入一些内容时在这里犯了一个错误!我很抱歉。
  • 正如我在OP中提到的,发送包裹可以,但接收方没有收到。
  • 我没有看到编辑OP的选项,不知道是否有其他人可以为我做并纠正错误!
  • 我应该删除我的答案吗?
  • 我会说离开它,因为其他人可能会指出同样的错误。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2018-05-15
  • 2020-05-05
  • 2012-01-05
  • 1970-01-01
相关资源
最近更新 更多