我有一项通过AIDL与其他服务进行通信的服务。我希望该服务受我的应用程序中的活动约束。该服务可以定义两个绑定器\接口吗?我已经尝试过使用信使与活动进行通信,重写“onBind”方法,以便根据获取的意图返回不同的绑定器(一个用于其他服务,一个用于活动)。
但是当活动(使用相同的绑定器)从服务解除绑定时,我有一个错误“myService已泄漏ServiceConnection ...最初绑定在这里”,我认为这是关于服务用于通信的绑定与其他服务。
如果服务不能使用两个接口,我如何实现活动与该服务之间的通信?
答案 0 :(得分:1)
如果通过
“覆盖” onBind“方法,以便它返回不同的活页夹 根据它的意图得到“
您的意思是,您为Intent设置了一个额外的值,表明该操作无效。 根据{{1}}中的文档:
Intent:用于绑定到此服务的Intent,如 Context.bindService。请注意, 此时的意图不会在这里显示。
尝试给您的意图一个自定义动作,并检查是否可行
答案 1 :(得分:0)
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):