使用自定义Parcelable时ClassNotFoundException

时间:2010-02-21 21:14:55

标签: 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)

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

由于

3 个答案:

答案 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