Art*_*wri 6 android marshalling unmarshalling parcelable multiple-processes
我试图了解如何在Android中的应用程序之间进行通信 - 而不仅仅是在Activity实例之间.
我建立了一个"客户端",它将一个Messenger obj发送给一个服务(在Intent发送到服务中); 该服务创建一个Messageobj并使用它将其发送回'client' messenger.send(message).这工作正常,直到我尝试使用Message.obj来保存对象.
我在服务中创建了自己的Parcelable类MyParcelable并将其放入消息中.一切都有效,直到消息在"客户端"中被解组.unmarshall失败,因为'客户'无法访问MyParcelable该类.这是显而易见的-他们是在不同的包(说com.whatever.myclient和com.whatever.myserver).这完全是错误的方法吗?
我也尝试过创建Parcel并发送(两个应用程序都可以访问该类) - 但事实Parcel并非如此Parcelable.我已经阅读过关于正在使用的类加载器,但是不了解单独的应用程序中的单独的类加载器(进程,如果我在这方面理解Android架构).也就是说,如何对一个类加载器"教授"另一个类加载器中存在的类?当然看起来应该有一个明显的"这就是你如何做到",但我还没有看到它.
您无法在不了解此类的进程中解组该类(正如您已经正确指出的那样)。如果你想MyParcelable发送到你的Service,那么你需要包含MyParcelable在Serviceat构建中,并ClassLoader包含解组时使用的权限,因为解组是由系统线程完成的,MyParcelable即使你包含它也不知道是什么在编译时。
编辑:
(a) 将 MyParcelable 包含到 2 个不同的 pkg 中,并将它们视为同一类
创建一个公共类库并将其包含在两个应用程序(应用程序和 )中Service。您可以将其标记为 Android 库(在 Eclipse 中,它位于项目的 Android 属性下方),也可以将其导出为 JAR 并将其导入到两个应用程序中。在库中拥有独立的类而不是直接将它们放入应用程序中总是一个好主意。这样您就可以在其他项目中重用它们;)
(2) 包含正确的类加载器(例如,我从哪里获得正确的类加载器)
ClassLoader当您执行代码时,您可以从当前线程获取。显然,它ClassLoader知道您的类,因为它正在执行您的代码;)例如,在 中Activity#onCreate(),您可以执行以下操作Thread.currentThread.getContextClassLoader():由于您的MyParcelable类也包含在 中Service,因此您可以执行相同的操作以获得有效的ClassLoader解组。
IPC 的另一个解决方案是定义一个AIDL 接口,这样您就不必实现Parcelable.
| 归档时间: |
|
| 查看次数: |
2293 次 |
| 最近记录: |