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

时间:2012-12-23 16:13:49

标签: android android-service messenger aidl android-binder

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

但是当活动(使用相同的绑定器)从服务解除绑定时,我有一个错误“myService已泄漏ServiceConnection ...最初绑定在这里”,我认为这是关于服务用于通信的绑定与其他服务。
如果服务不能使用两个接口,我如何实现活动与该服务之间的通信?

谢谢你, -Liron

2 个答案:

答案 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):

enter image description here