我想了解如何将应用程序之间的通信,Android的-不只是之间Activity
情况。
我建立了一个“客户”发送一个信使OBJ的服务(在Intent
发送到服务); 服务创建一个Message
的obj并将其发送回给“客户”使用messenger.send(message)
。 直到我尝试使用Message.obj用以保持物体也能正常工作。
我创建了自己Parcelable
类MyParcelable
在服务,放入该消息。 所有的作品,直到消息被解组的“客户”。 该和解组失败,因为“客户”具有非访问MyParcelable
类。 这是显而易见的-他们是在不同的包(说com.whatever.myclient
和com.whatever.myserver
)。 这是完全错误的方式去了解呢?
我也尝试创建一个Parcel
并发送那(这两个应用程序将因此拥有访问类) -但Parcel
是不是Parcelable
。 我看了一下正在使用的类加载器,但不明白类单独的应用程序如何单独装载机(进程,如果我理解的Android架构在这方面)。 也就是说,怎么能一个类加载器“教”大约存在于其他类加载器类? 这当然看起来应该有一个明显的“你这是怎么做到这一点”,但我还没有看到它。
你不能在一个没有这类知识(因为你已经正确地指出)的过程解组的类。 如果你想MyParcelable
被发送到你的Service
,那么你需要包括MyParcelable
的Service
在构建, 并包括正确的ClassLoader
解组时使用,因为解组是一个系统线程,不知道是什么做MyParcelable
甚至,如果你提供它在编译的时候。
编辑 :
(a)中包括MyParcelable成2个不同PKGS并将它们被看作是相同的类
让你的普通类的库并将它包含在这两个应用程序(应用程序和Service
)。 您可以将其标记为一个Android库(在Eclipse中,这是正确的根据项目的Android属性)或导出为一个JAR并将其导入在这两个应用程序。 它总是在一个库中,而不是把他们直接在应用程序的独立类是一个好主意。 这样,您就可以重新使用他们在其他项目上;)
(2)包括正确的类加载器(我在哪里得到正确的类加载器,例如)
你能得到你ClassLoader
从当前线程,当你执行你的代码。 显然,这ClassLoader
知道你的类,因为它的执行你的代码;)例如,在Activity#onCreate()
你可以做Thread.currentThread.getContextClassLoader()
由于您的MyParcelable
类也包含在Service
,你可以做同样获得有效ClassLoader
来解读。
IPC的另一种解决方案是定义一个AIDL接口 ,这样你就不必实现Parcelable
。
如果你不想某处使用一个持久层(i使用云API),你可以在单独的进程运行的服务和绑定到服务需要共享值保持器类型的对象数据的相应的应用程序。 该服务将在您构建并获得代表连接(结合)的应用程序的OBJ值。
OK,我发现了“简单的方法:”我一直在寻找。 你可以把一个束引入Message.obj领域。 捆绑是Parcelable所以客户端和服务器之间传输。 还有不知道它是什么接收类作为包被“建成” Android的Java中没有服务器的问题。 和捆绑显然可以包括“子束”在,这比对付确保双方都知道一个用户定义的类的定义简单。 感谢您的答案上面 - 我当然感谢的信息!