我使用自定义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)
那么有什么方法可以解决这个问题吗?任何帮助将不胜感激。
由于
答案 0 :(得分:8)
您似乎面临此处描述的问题: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);
答案 1 :(得分:7)
将com.company.project.MyParcelable
放在实际应用程序中,而不是使用类加载器进行任何游戏。然后,它应该来自Intent
的发件人和收件人。
答案 2 :(得分:1)
Android中还有一个错误可以解释此问题,以防您尝试将意图传递给另一个意图: https://code.google.com/p/android/issues/detail?id=179480&thanks=179480&ts=1436464704