gpt4 book ai didi

java - 为什么 AIDL/Messenger 绑定(bind)到服务?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:21 24 4
gpt4 key购买 nike

场景:我有一个 Controller(普通 Java 类),它必须能够控制多个 Slave

Slave 的性质可能不同,因此它可以是:

  1. 一个Service,我们称它为ServiceSlave:这个对象的生命周期通常不同于应用程序的组件(也就是说,它不依赖于当前 Activity )
  2. 一个简单的 Java 类,例如 ObjectSlave:此对象的生命周期在某种程度上受限于创建它的范围(例如,当前 Activity )

这两种类型的 Slave 的共同点是,它们可以驻留在不同的进程中


由于这最后一个“要求”,我立即将注意力转向 AIDL/Messenger 作为 ControllerSlave,因为它提供 IPC。

但是,似乎 AIDL(以及 Messenger,因为它也应该基于 AIDL)只有在您需要时才被定义使用 Service。也就是说,如果没有 IBinder 对象,我无法实现基于 AIDL 的接口(interface),该对象通常在 onServiceConnected 方法中提供.

第一个问题:AIDL 真的只能在处理服务 时使用吗?如果是,为什么会这样?

现在,考虑我的场景。我想,就像任何其他优秀的开发人员一样,编写一个单一的、优雅的界面,允许 Controller 引导每个 Slave,无论它们的性质如何。到目前为止,我想到的唯一解决方案涉及使用 IntentBroadcastReceiver,所有这些都方便地包装在专用的 Java 类中。

第二个问题:这是唯一可行的方法吗?我在监督什么吗?


编辑

我想我应该更详细地说明 Controller 元素的实际作用。它是一个与订阅它的多个 UI 小部件松散耦合的组件。它的设计(自愿)使其不需要对 Context 的引用。因此它不需要直接使用 UI 小部件,但这些小部件又依赖于Controller

最佳答案

这是一个很好的问题,但不是一个简单的问题。与大多数事情一样,可以采用多种方法来解决此类问题。首先要检查的是您的 Controller 是否需要或使用 UI 组件。如果没有,则需要将其封装在 Service 中。 Activity 生命周期是这样的,它只会在屏幕上显示当前内容时运行。一旦用户按下 HOME 或 BACK,它就会分别停止或销毁。通过通知或从您的应用程序内启动另一个应用程序将产生类似于按 HOME 的效果:您的 Activity 将暂停。

因此,假设您不需要/不想要您的 Controller 的 UI,您有很多东西可供您使用:

  1. 通过公开自定义 AIDL 接口(interface)使您的服务成为“绑定(bind)”服务。不难,但也不难。
  2. 让您的服务响应自定义 Intent 以采取一些行动。 Service 然后可以触发广播或启动特定的“从属”Activity。如果对此感兴趣,请探索使用 IntentService 来更好地管理线程并防止您的应用出现 ANR。
  3. 与之前类似,使用自定义 Intent 并让您的从属发送一个 Messenger 对象,它在 Intent 中创建了一个额外的对象.此时 Service 可以将消息发送到 Messenger,它由从属 Activity 拥有,并将传递到特定的 处理程序

对于选项 2 和 3,您不需要自定义 AIDL 公开接口(interface)。您是正确的,因为如果您要使用绑定(bind)服务和您的 Service.onBind() 方法必须返回 Binder 接口(interface) stub 实现的一个实例。

综上所述,您可以使用 3 种方法中的任何一种来实现使用驻留在 ActivityService 实例中的从类的目标。使用 AIDL 或 Messenger 方法的优点是减少上下文切换(更有效),因为您不发送 Intent 对象。每次发送 Intent 时,发件人都会联系在系统进程中运行的 ActivityManagerService 以解决 Intent 的交付位置。使用 AIDL 和 Messenger,只有初始的 bindService()startService() 调用会到达 ActivityManagerService。在那之后,使用两个进程之间的直接绑定(bind)器执行通信。

关于java - 为什么 AIDL/Messenger 绑定(bind)到服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27864742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com