Seb*_*ano 5 java android ipc aidl
场景:我有一个Controller(普通的 Java 类)必须能够引导多个Slaves。
ASlave的性质可以不同,因此它可以是:
Service,我们称之为 a ServiceSlave:这个对象的生命周期通常不同于应用程序的组件(比如,它不依赖于当前的活动)ObjectSlave:这个对象的生命周期在某种程度上绑定到它被创建的范围(比如,当前活动)这两种类型的Slave共同点是它们可以驻留在不同的进程中。
由于这最后一个“要求”,我立即将注意力转向AIDL/Messenger作为 aController和 a之间的通信形式Slave,因为它提供了 IPC。
然而,似乎AIDL(反过来Messenger,因为它也应该基于 AIDL)只有在您使用Service. 也就是说,我没有办法在AIDL没有IBinder对象的情况下实现基于 -based 的接口,通常在onServiceConnected方法中提供。
第一个问题:AIDL真的只能在处理a时使用Service吗?如果是,为什么会这样?
现在,考虑我的场景。我想,就像任何其他优秀的开发人员一样,编写一个单一的、优雅的界面,允许Controller引导每个Slave,而不管它们的性质。到目前为止,我想到的唯一解决方案是使用Intents 和BroadcastReceivers,所有这些都方便地包装在专用的 Java 类中。
第二个问题:这是唯一可行的方法吗?我在监督什么吗?
编辑
我想我应该提供有关Controller元素实际作用的更多详细信息。它是一个与订阅它的多个 UI 小部件松散耦合的组件。它的设计(自愿)使其不需要对Context. 所以它不需要或直接使用UI 小部件,但反过来这些小部件依赖于Controller.
这是一个很好的问题,但不是一个容易回答的问题。与大多数事情一样,可以采用多种方法来解决此类问题。首先要检查的是您是否Controller需要或使用 UI 组件。如果没有,那么您需要将其封装在Service. Activity生命周期是这样的,只有当它是屏幕上的当前内容时才会运行。一旦用户按下 HOME 或 BACK,它就会分别停止或销毁。通过通知或从应用程序内启动另一个应用程序将产生类似于按 HOME 的效果:您Activity将暂停。
因此,假设您不需要/不想要 UI Controller,那么您可以使用许多东西:
Intent以采取一些操作。然后可以Service回击广播或启动特定的“从机” Activity。如果对此感兴趣,请探索如何使用它来IntentService更好地管理线程并防止应用程序发生 ANR。Intent并让您的从属发送一个Messenger它在Intent. 此时Service可以将消息发送到Messenger,该消息由从属设备拥有Activity并将被传递到特定的Handler。对于选项 2 和 3,您不需要自定义 AIDL 公开接口。如果您要使用绑定服务,并且您的方法Service.onBind()必须返回活页夹接口存根实现的实例,则您必须定义 AIDL 接口,这是正确的。
综上所述,您可以使用这 3 种方法中的任何一种来实现使用驻留在 或Activity实例中的从属类的目标Service。使用 AIDL 或Messenger方法的优点是减少上下文切换(更有效),因为您不发送Intent对象。每次发送 时Intent,发送者都会联系ActivityManagerService系统中运行的进程来确定Intent将其发送到何处。使用 AIDL 时Messenger,只有初始的bindService()或startService()调用才能到达ActivityManagerService. 之后,使用两个进程之间的直接绑定器执行通信。
| 归档时间: |
|
| 查看次数: |
1132 次 |
| 最近记录: |