【发布时间】:2015-01-09 16:15:27
【问题描述】:
场景:我有一个 Controller(普通 Java 类),它必须能够引导多个 Slaves。
Slave 的性质可能不同,因此它可以是:
-
Service,我们称之为ServiceSlave:这个对象的生命周期通常与应用程序的组件不同(也就是说,它不依赖于当前的活动) - 一个简单的 Java 类,比如
ObjectSlave:这个对象的生命周期在某种程度上受限于它的创建范围(比如当前活动)
这两种Slaves 的共同点是它们可以驻留在不同的进程中。
因为这最后一个“要求”,我立即将注意力转向AIDL/Messenger,作为Controller和Slave之间的通信形式,因为它提供了IPC。
但是,似乎AIDL(以及Messenger,因为它也应该基于AIDL)只有在您使用Service时才被定义 .也就是说,如果没有IBinder 对象,我无法实现基于AIDL 的接口,而onServiceConnected 方法中通常会提供该对象。
第一个问题:AIDL 真的只能在处理Service 时使用吗?如果是,为什么会这样?
现在,考虑一下我的情况。就像任何其他优秀的开发人员一样,我想编写一个单一的、优雅的界面,允许Controller 引导每个Slave,不管它们的性质如何。到目前为止,我想到的唯一解决方案是使用 Intents 和 BroadcastReceivers,所有这些都方便地包装在专用的 Java 类中。
第二个问题:这是唯一可行的方法吗?我在监督什么吗?
编辑
我想我应该详细说明Controller 元素的实际作用。它是一个与订阅它的几个 UI 小部件松散耦合的组件。它的设计(自愿)使其不需要引用Context。因此它不需要 或直接使用 UI 小部件,但这些小部件又依赖于Controller。
【问题讨论】:
-
好的,根据您编辑的信息,我对 Controller/Slave 范式的真正目标感到困惑。如果它完全在您的应用程序中的
Activity内部(不需要Context),那么您根本不需要Service、AIDL 或Messenger。当您跨越进程边界或 (Service) 正在运行的不是以 UI 为中心的东西时,这些都将被使用。如果您只是将其用作内部发布-订阅类型系统,那么您必须定义类和接口。话虽如此,您可能希望将 EventBus 或 Otto 视为可能的 3rd 方助手。 -
好的,所以我在解释这一点时显然有问题:) 我的主要问题是关于如何在
Controller和Slave之间进行通信,后者可能是也可能不是 @987654354 @。通信必须是进程间的(因为Controller和Slave可能运行在不同的进程上),但也可能在同一个进程内。 -
但是,
Controller是否仅在拥有的Activity运行时出现? -
不,在某些情况下
Controller不绑定到Activity,而是存在于Service中。