【问题标题】:Can an Android service provide two interfaces to communicate with?Android 服务可以提供两个接口进行通信吗?
【发布时间】:2012-12-10 08:29:13
【问题描述】:

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

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

谢谢你, -利隆

【问题讨论】:

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


    【解决方案1】:

    如果通过

    "覆盖"onBind"方法,使其返回不同的绑定器 根据它得到的意图“

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

    Intent:用于绑定到此服务的 Intent,如给定 Context.bindService。请注意,包含在 此处不会显示此时的意图。

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

    【讨论】:

      【解决方案2】:

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

      注意:仅当您允许来自不同应用程序的客户端访问您的 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):

      【讨论】:

      • 答案是题外话,因为 OP 很清楚何时使用什么。他的问题是他是否可以根据 Intent 发送返回 onBind 中的不同 Binder。您回答了何时使用哪个活页夹。
      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 2022-01-21
      相关资源
      最近更新 更多