我使用自定义Parcelable将一些数据传送到BroadcastReceiver.这是我做的:
我注册了我的意图并在其上设置了额外的Parcelable以及一个额外的类加载器(intent.setExtraClassLoader(..)).接下来,我通过AlarmManager安排广播的执行.
因此,当AlarmManager触发时,它会查看我的意图,因为它不使用提供的类加载器(因为它接缝),因此无法处理它的包裹.
我认为当Inten.fillIn将意图复制到一个新的时,类加载器会丢失(请参阅堆栈跟踪).
02-21 21:09:25.214: WARN/Intent(52): android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.company.project.MyParcelable
02-21 21:09:25.214: WARN/Intent(52): at android.os.Parcel.readParcelable(Parcel.java:1822)
02-21 21:09:25.214: WARN/Intent(52): at android.os.Parcel.readValue(Parcel.java:1713)
02-21 21:09:25.214: WARN/Intent(52): at android.os.Parcel.readMapInternal(Parcel.java:1947)
02-21 21:09:25.214: WARN/Intent(52): at android.os.Bundle.unparcel(Bundle.java:169)
02-21 21:09:25.214: WARN/Intent(52): at android.os.Bundle.putAll(Bundle.java:242)
02-21 21:09:25.214: WARN/Intent(52): at android.content.Intent.fillIn(Intent.java:4530)
02-21 21:09:25.214: WARN/Intent(52): at com.android.server.am.PendingIntentRecord.send(PendingIntentRecord.java:185)
02-21 21:09:25.214: WARN/Intent(52): at android.app.PendingIntent.send(PendingIntent.java:400)
02-21 21:09:25.214: WARN/Intent(52): at com.android.server.AlarmManagerService$AlarmThread.run(AlarmManagerService.java:636)
Run Code Online (Sandbox Code Playgroud)
那么有什么方法可以解决这个问题吗?任何帮助,将不胜感激.
谢谢
您似乎面临此处描述的问题:https://code.google.com/p/android/issues/detail?id = 6822
在该链接下的评论之一中描述了一种解决方法:将您的自定义添加Parcelable
到其他内容中Bundle
.由于在Bundle
需要之前不会触及内部构件,因此Intent
可以将此类内容传递到您的应用程序,因为没有人会尝试在您的应用程序之外解组您的课程.
Bundle hackBundle = new Bundle();
hackBundle.put("key", myParcelable);
intent.putExtra("bundleKey", hackBundle);
Run Code Online (Sandbox Code Playgroud)
放入com.company.project.MyParcelable
实际的应用程序,而不是做任何你正在使用类加载器的游戏.然后,它应该从发件人和收件人都可用Intent
.