簡體   English   中英

通過意圖將自定義對象傳遞給BroadcastReceiver結果返回null

[英]Passing a custom object to BroadcastReceiver results via intent returns null

我正在嘗試將自定義數據類對象從前台服務傳遞到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)
    }
}

這是BroadcastReceiver:

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,即直接傳遞可包裹對象。 兩者均不會在服務中產生任何錯誤,但接收者始終將其報告為null。 我包括了logcat的堆棧跟蹤:

4081-4081 / abc E / AndroidRuntime:致命例外:主進程:abc,PID:4081 java.lang.RuntimeException:無法啟動接收器abcAlarmsRcvr:java.lang.NullPointerException:嘗試調用虛擬方法'android.os.Parcelable android .os.Bundle.getParcelable(java.lang.String)'在android.app.ActivityThread.access $ 1200(ActivityThread.java:200)上的android.app.ActivityThread.handleReceiver(ActivityThread.java:3389)上為空對象引用在android.os.Looper.loop(Looper.java:193)在android.os.Handler.dispatchMessage(Handler.java:106)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1662)在android。 app.ActivityThread.main(ActivityThread.java:6680)位於com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)位於java.lang.reflect.Method.invoke(本地方法) android.internal.os.ZygoteInit.main(ZygoteInit.java:858)原因:java.lang.NullPointerException:嘗試調用虛擬方法'android.os.Parcelable android.os.Bundle.ge tParcelable(java.lang.String)'在android.app.ActivityThread.handleReceiver(ActivityThread.java:3380)上的abcMyRcvr.onReceive(MyRcvr.kt:21)在android.app.ActivityThread.access $ 1200( android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1662)上的ActivityThread.java:200)android.os.Looper.loop(Looper.java)上android.os.Handler.dispatchMessage(Handler.java:106)上的ActivityThread.java:200) :193),位於android.app.ActivityThread.main(ActivityThread.java:6680),位於com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java)的java.lang.reflect.Method.invoke(本機方法) :493),位於com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我開始懷疑這是最新的SDK還是Kotlin插件中的錯誤。 有什么想法我可能做錯了嗎?

更改

   bundle.putParcelable("MyParcel", MyParcel)

   bundle.putParcelable("MyParcel", myParcel)

請注意第二行中的小寫字母“ m”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM