首页 文章

Android服务可以提供两个与之通信的接口吗?

提问于
浏览
7

我有一个通过AIDL与其他服务进行通信的服务 . 我希望该服务受我的应用程序中的活动的约束 . 该服务可以定义两个 Binders \接口吗?我已经尝试过使用信使与活动进行通信,重写“onBind”方法,以便根据获取的意图返回不同的 Binders (一个用于其他服务,一个用于活动) .

但是当活动(使用相同的 Binders )从服务解除绑定时,我有一个错误"myService has leaked ServiceConnection ... that was originally bound here",我认为这是关于服务用于与其他服务进行通信的绑定 .
如果服务不能使用两个接口,我如何实现活动与该服务之间的通信?

谢谢你,-Liron

1 回答

  • 1

    AIDL和Messenger用于IPC与其他应用程序/进程 . 来自Android API Guide

    注意:仅当您允许来自不同应用程序的客户端访问IPC服务并希望在您的服务中处理多线程时,才需要使用AIDL . 如果您不需要跨不同的应用程序执行并发IPC,则应通过实现Binder创建接口,或者,如果要执行IPC,但不需要处理多线程,请使用Messenger实现接口 . 无论如何,在实施AIDL之前,请确保您了解绑定服务 .

    如果您的活动与服务处于同一过程中,则只需要扩展Binder .

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

    有关绑定服务生命周期的此图形可能有助于您如何绑定/解除绑定(http://developer.android.com/guide/components/bound-services.html#Lifecycle):

    enter image description here

相关问题