使用自定义Parcelable时ClassNotFoundException

Mor*_*itz 12 android

我使用自定义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)

那么有什么方法可以解决这个问题吗?任何帮助,将不胜感激.

谢谢

Rom*_*zur 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);
Run Code Online (Sandbox Code Playgroud)


Com*_*are 7

放入com.company.project.MyParcelable实际的应用程序,而不是做任何你正在使用类加载器的游戏.然后,它应该从发件人和收件人都可用Intent.

  • 哦! 我知道了.我没有注意到堆栈中的痕迹.在袖口上,看起来你不能使用带有'PendingIntent`的自定义`Parcelable`,这有点臭.您可能需要以其他方式序列化您的对象(例如,以"Bundle","String"),而不是使用"Parcelable". (5认同)