java – 为什么AIDL / Messenger绑定到服务?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么AIDL / Messenger绑定到服务?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2590字,纯文字阅读大概需要4分钟。
内容图文
![java – 为什么AIDL / Messenger绑定到服务?](/upload/InfoBanner/zyjiaocheng/818/011ac9a5fdfa4146afc7f46bbb940ebc.jpg)
场景:我有一个Controller(普通的Java类),它必须能够引导几个Slave.
奴隶的性质可以不同,因此它可以是:
>服务,我们称之为ServiceSlave:此对象的生命周期通常与应用程序的组件不同(例如,它不依赖于当前活动)
>一个简单的Java类,比如说ObjectSlave:这个对象的生命周期在某种程度上与创建它的范围有关(比如当前的活动)
这两种类型的奴隶有什么共同点,就是它们可以存在于不同的过程中.
由于这最后的“要求”,我立即将注意力转移到AIDL / Messenger作为Controller和Slave之间的通信形式,因为它提供了IPC.
但是,如果您要使用服务,似乎只定义了AIDL(以及Messenger,因为它应该也基于AIDL).也就是说,我没有办法在没有IBinder对象的情况下实现基于AIDL的接口,IBinder对象通常在onServiceConnected方法中提供.
第一个问题:AIDL真的只能在处理服务时使用吗?如果是,为什么呢?
现在,考虑一下我的情景.正如任何其他优秀的开发人员所希望的那样,我希望编写一个优雅的界面,允许Controller控制每个Slave,无论其性质如何.到目前为止,我想到的唯一解决方案是使用Intents和BroadcastReceivers,它们都可以方便地包含在专用的Java类中.
第二个问题:这是唯一可行的方法吗?我在监督什么吗?
编辑
我想我应该提供有关Controller元素实际功能的更多细节.它是一个与几个UI小部件松散耦合的组件,他们订阅了它.它已被设计(自愿),因此它不需要对Context的引用.因此它不需要或直接使用UI小部件,但反过来这些小部件依赖于Controller.
解决方法:
这是一个很好但不是一个简单的问题.像大多数事情一样,有多种方法可以解决这类问题.首先要检查的是Controller是否需要或使用UI组件.如果没有,那么您需要将其封装在服务中.活动生命周期是这样的,只有当它是屏幕上的当前事物时它才会运行.一旦用户按下HOME或BACK,它就会分别停止或销毁.通过通知或在您的应用程序中启动另一个应用程序将产生类似于按HOME的效果:您的活动将暂停.
因此,假设您不需要/想要控制器的UI,您可以使用大量的东西:
>通过公开自定义AIDL界面,使您的服务成为“绑定”服务.不难,但也不是因为佯攻.
>让您的服务响应自定义Intent以采取一些措施.然后,该服务可以重新开始广播或启动特定的“奴隶”活动.如果对此感兴趣,请探索使用IntentService来更好地管理线程并防止应用程序出现ANR.
>与上一个类似,使用自定义Intent并让您的slave发送一个它在Intent中作为额外创建的Messenger对象.此时,服务可以向Messenger发送消息,该消息由从属Activity拥有,并将传递给特定的处理程序.
您不需要为选项2和3提供自定义AIDL公开接口.如果要使用绑定服务并且Service.onBind()方法必须返回绑定器的实例,则必须定义AIDL接口.接口存根实现.
所有这些,您可以使用这3种方法中的任何一种来实现使用驻留在Activity或Service实例中的slave类的目标.使用AIDL或Messenger方法的优点是减少了上下文切换(更高效),因为您没有发送Intent对象.每次发送Intent时,发件人都会联系在系统进程中运行的ActivityManagerService,以解析Intent的传递位置.使用AIDL和Messenger,只有初始bindService()或startService()调用才能访问ActivityManagerService.在此之后,使用两个进程之间的直接绑定器执行通信.
内容总结
以上是互联网集市为您收集整理的java – 为什么AIDL / Messenger绑定到服务?全部内容,希望文章能够帮你解决java – 为什么AIDL / Messenger绑定到服务?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。