我应该扩展Binder类还是使用Messenger?

CNo*_*ris 5 service android

在我的应用程序中,我设计了一个可以持续获取数据的服务(有充分理由,它来自某些传感器)并将其提供给两个客户端:

  • 用于显示实时数据的UI活动
  • 记录数据的另一项服务

在任何时候,这两个客户端中的一个或两个都可能正在运行.

我认为此服务应该是绑定服务,而日志服务是启动服务.

Android 文档说明我应该扩展Binder类,或者如果我想从另一个进程访问该服务,请使用Messenger.

这项服务,日志服务和UI活动都将在同一个apk中,因此它们可能会在同一个过程中 - 但这将是最好的解决方案吗?我怀疑文档可能没有考虑到我可以在与服务相同的进程中拥有两个客户端的可能性.

谢谢

ρяσ*_*я K 9

Android 文档明确指出
扩展Binder类
如果您的服务是您自己的应用程序的私有服务并且在与客户端相同的进程中运行(这是常见的),您应该通过扩展Binder类并从中返回它的实例来创建您的接口. onBind().客户端接收Binder并可以使用它直接访问Binder实现甚至服务中可用的公共方法.当您的服务仅仅是您自己的应用程序的后台工作程序时,这是首选技术.您不以这种方式创建界面的唯一原因是因为您的服务被其他应用程序或跨单独的进程使用.

使用Messenger
如果您需要在不同进程中使用界面,则可以使用Messenger为服务创建界面.通过这种方式,服务定义了一个响应不同类型的Message对象的Handler.此Handler是Messenger的基础,然后可以与客户端共享IBinder,允许客户端使用Message对象向服务发送命令.此外,客户端可以定义自己的Messenger,以便服务可以发回消息.这是执行进程间通信(IPC)的最简单方法,因为Messenger将所有请求排队到一个线程中,这样您就不必将服务设计为线程安全的.

因此,最好的选择是IBinder在此服务是本地服务时通过扩展类来使用服务.当使用Messenger和创建两个服务时AIDL,它们是远程服务.


CNo*_*ris -2

imrankhan 的首选解决方案(Binder)似乎确实有效,但最终我选择了 Messenger,因为在实践中我发现该解决方案更灵活且编码更符合逻辑。