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

问题描述 投票:9回答:2

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

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

谢谢你,-Liron

android android-service messenger aidl android-binder
2个回答
2
投票

如果通过

“覆盖”onBind“方法,以便根据其获得的意图返回不同的绑定器”

你的意思是,你为你的意图设置了一个额外的东西,说明做什么是行不通的。根据onBind(Intent)的文件:

Intent:用于绑定到此服务的Intent,如Context.bindService所示。请注意,此处不会显示Intent中包含的任何额外内容。

尝试给你的意图一个自定义动作,并检查是否有效


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

© www.soinside.com 2019 - 2024. All rights reserved.