我试图了解如何在 Android 中的应用程序之间进行通信 - 而不仅仅是在应用程序之间进行通信Activity
实例。
我设置了一个“客户端”,将 Messenger 对象发送到服务(在Intent
发送到服务);该服务创建了一个Message
obj 并将其发送回“客户端”使用messenger.send(message)
。这工作正常,直到我尝试使用 Message.obj 来保存对象。
我创建了自己的Parcelable
class MyParcelable
在服务中并将其放入消息中。一切正常,直到消息在“客户端”中被解组为止。解组失败,因为“客户端”无权访问MyParcelable
班级。这是显而易见的 - 它们位于不同的包中(例如com.whatever.myclient
and com.whatever.myserver
)。这是完全错误的做法吗?
我也尝试过创建一个Parcel
并发送该信息(因此两个应用程序都可以访问该类)-但是Parcel
is not Parcelable
。我读过有关使用类加载器的信息,但不明白如何在单独的应用程序中分离类加载器(进程,如果我在这方面了解 Android 架构的话)。也就是说,一个类加载器如何“教授”另一个类加载器中存在的类?当然,似乎应该有一个明显的“你就是这样做的”,但我还没有看到它。
您无法在不了解此类的进程中解组该类(正如您已经正确指出的那样)。如果你想MyParcelable
发送至您的Service
,那么你需要包括MyParcelable
in the Service
在构建时,and包括权利ClassLoader
在解组时使用,因为解组是由系统线程完成的,它不知道什么MyParcelable
即使您在编译时包含它也是如此。
EDIT:
(a) 将 MyParcelable 包含到 2 个不同的 pkg 中并让它们可见
作为同一个班级
创建一个公共类库并将其包含在两个应用程序中(应用程序和Service
)。您可以将其标记为 Android 库(在 Eclipse 中,它位于项目的 Android 属性下方),也可以将其导出为 JAR 并将其导入到两个应用程序中。拥有它总是一个好主意独立的类放在库中,而不是直接将它们放入应用程序中。这样您就可以在其他项目中重用它们;)
(2) 包含正确的类加载器(我从哪里获得正确的类
装载机,例如)
你可以获得你的ClassLoader
当您执行代码时从当前线程。显然这个ClassLoader
了解您的类,因为它正在执行您的代码;)例如Activity#onCreate()
, 你可以做Thread.currentThread.getContextClassLoader()
。自从你的MyParcelable
类也包含在Service
,你可以做同样的事情来获得有效的ClassLoader
解组。
IPC 的另一个解决方案是定义一个AIDL接口 http://developer.android.com/guide/components/aidl.html所以你不必实施Parcelable
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)