Android 使用自定义包裹时ClassNotFoundException

Android 使用自定义包裹时ClassNotFoundException,android,Android,我使用一个定制的包裹将一些数据传送到广播接收器。以下是我的工作: 我注册了我的意图,并在其上设置了额外的包裹以及一个额外的类加载器(intent.setExtraClassLoader(..)。接下来,我通过AlarmManager计划广播的执行 因此,当AlarmManager启动时,它会查看我的意图及其无法处理的包,因为它不使用提供的类加载器(正如它所做的那样) 我认为当Inten.fillIn将意图复制到一个新的意图时,类加载器就会丢失(请参见堆栈跟踪) 那么有没有办法解决这个问题呢?任何

我使用一个定制的包裹将一些数据传送到广播接收器。以下是我的工作:

我注册了我的意图,并在其上设置了额外的包裹以及一个额外的类加载器(intent.setExtraClassLoader(..)。接下来,我通过AlarmManager计划广播的执行

因此,当AlarmManager启动时,它会查看我的意图及其无法处理的包,因为它不使用提供的类加载器(正如它所做的那样)

我认为当Inten.fillIn将意图复制到一个新的意图时,类加载器就会丢失(请参见堆栈跟踪)

那么有没有办法解决这个问题呢?任何帮助都将不胜感激


感谢您将
com.company.project.MyParcelable

放到实际应用程序中,而不是使用类加载器玩任何游戏。然后,它应该可以从
意图的发送者和接收者处获得

您似乎面临着这里描述的问题:

在该链接下的一条注释中描述了一种解决方法:将自定义的
包裹
放入另一个
。由于
捆绑包
内部在需要时才被触及,这样的
意图
可以传递到你的应用程序,因为没有人会试图在你的应用程序之外解开你的类

  Bundle hackBundle = new Bundle();
  hackBundle.put("key", myParcelable);
  intent.putExtra("bundleKey", hackBundle);

Android中还有一个bug可以解释这个问题,如果您试图传递另一个意图:

当接收到启动完成操作时,会安排AlarmManager。因此,我不会在应用程序中启动意图。有没有更好的方法来处理这种情况?哦!我懂了。我在堆栈跟踪中没有注意到这一点。即兴使用时,您似乎无法将定制的
包裹
悬挂式帐篷
一起使用,这有点臭。与其使用
Parcelable
,您可能需要以其他方式序列化对象(例如,到
Bundle
,到
String
)。是的,通过一个额外的就绪对象传输数据是一种方法。但奇怪的是,我得到了上面提到的异常,但我的数据对象实际上被传输了。所以它确实有效,但总是会泄露异常,这让人感到困惑和威胁。嗯……如果还没有问题的话,你可能想把它作为一个问题发布出来。我一辈子都搞不明白为什么
PendingIntent
试图反序列化您的
Parcelable
@commonware我认为AlarmManager这样做的原因是因为它想在发送时复制捆绑内容,而您对打包数据执行此操作的方式是先将其解列,然后重新打包。执行此操作的代码位于Intent.fillIn()中,并且是最好的。如果它可以复制它所做的额外数据,否则它将使用原始的额外数据,这就是为什么您的数据仍然安全地交付的原因。Intent.fillIn()中的代码指出了它的工作方式可能会失败,但将修复推迟到将来,并说:“-”(“密钥包有一个‘规则’,密钥意图可能不同?对我来说,它不起作用。我在这里和6822安卓问题线程讨论中尝试了所有评论。还有另一个WA?
  Bundle hackBundle = new Bundle();
  hackBundle.put("key", myParcelable);
  intent.putExtra("bundleKey", hackBundle);