9

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

但是,当活动(使用相同的活页夹)与服务解除绑定时,我有一个错误“myService has leaked ServiceConnection ... that was original bound here”,我认为这是关于服务用来与另一个通信的活页夹服务。
如果一个服务不能使用两个接口,我该如何实现活动和该服务之间的通信?

谢谢你,-Liron

4

2 回答 2

2

如果通过

“覆盖“onBind”方法,使其根据获得的意图返回不同的活页夹“

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

Intent:用于绑定到此服务的 Intent,与 Context.bindService 相同。请注意,此时 Intent 中包含的任何附加内容都不会在此处显示。

尝试为您的意图提供自定义操作并检查是否有效

于 2019-04-12T09:52:41.880 回答
0

AIDL 和 Messenger 用于 IPC 与其他应用程序/进程。来自Android API 指南

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

如果你的activity和service在同一个进程中,你只需要扩展Binder。

扩展 Binder 类

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

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

在此处输入图像描述

于 2013-01-30T01:27:18.210 回答