1

我需要一些帮助来通过扩展 Binder 类来绑定服务。

我有 2 个 APK。第一个声明一个服务,我想从第二个 APK 的活动中绑定它。

两个 APK 使用相同的 sharedUserId 和相同的 android:process。

由于它们在同一个进程中运行,我不想使用 AIDL 进行 IPC 通信(我已经尝试过,它正在工作,但考虑到我只使用一个进程,我不想使用它)。

我可以启动/绑定服务,但无法获得对服务的引用:

LocalBinder binder = (LocalBinder);
mService = binder.getService();

我得到了例外:

E/AndroidRuntime(6145): java.lang.ClassCastException: 

在我的情况下,是否可以通过扩展 IBinder 类来绑定服务?

谢谢

4

2 回答 2

0

我从来没有尝试过,但我怀疑每个 .apk 都是使用自己的 .apk 加载的ClassLoader。这意味着来自每个 .apk 的两个具有相同名称的相同类将被 Dalvik VM 视为完全不同的类。

我相信你会发现这是不可能解决的。

因此,您应该使用aidl。我想你对aidl有两个反对意见。

  • 您可能不想花时间将所有数据编组到Parcelable类等中。但是,如上所述,我不相信您可能会找到一种方法将数据直接作为 Java 对象在两个 .apk 之间传递,即使在同一个进程中运行,所以你别无选择。
  • 也许您担心性能。但是您不必担心,因为当它们在同一个进程中时,Binder 调用(包括aidl 调用)变成了普通的函数调用。
于 2013-03-01T09:47:35.183 回答
0

使用 Messenger: 这是执行进程间通信 (IPC) 的最简单方法,因为 Messenger 将所有请求排队到单个线程中,因此您不必将服务设计为线程安全的。

如果您需要您的界面跨不同的进程(意味着不同的 APK)工作,您可以使用 Messenger 为服务创建一个界面。以这种方式,服务定义了一个 Handler 来响应不同类型的 Message 对象。这个 Handler 是 Messenger 的基础,它可以与客户端共享一个 IBinder,允许客户端使用 Message 对象向服务发送命令。此外,客户端可以定义自己的 Messenger,因此服务可以发回消息。

如果您需要您的服务与远程进程进行通信,那么您可以使用 Messenger 为您的服务提供接口。此技术允许您执行进程间通信 (IPC),而无需使用 AIDL。

以下是如何使用 Messenger 的摘要:

该服务实现了一个处理程序,该处理程序接收来自客户端的每个调用的回调。该服务使用 Handler 创建一个 Messenger 对象(它是对 Handler 的引用)。Messenger 创建一个 IBinder,服务从 onBind() 返回给客户端。客户端使用 IBinder 来实例化 Messenger(它引用服务的处理程序),客户端使用它来向服务发送消息对象。服务在其处理程序中接收每条消息——特别是在 handleMessage() 方法中。

这样,客户端就没有调用服务的方法了。相反,客户端传递服务在其处理程序中接收的消息(消息对象)。

于 2017-05-05T07:16:43.663 回答