有人可以区分使用广播接收器,AIDL(Android接口定义语言)和信使的场景吗?我被告知使用广播接收器是电池耗尽所以我不应该使用它。 AIDL和信使用于IPC(进程间通信),但我可以使用AIDL方式将数据从服务传递到同一进程中的活动。
那么在那种情况下,我应该更喜欢AIDL还是广播接收器?
================更新2015年1月24日==================== 要了解Messenger和AIDL机制之间的区别,as per documentation
使用Messenger 如果您需要您的界面跨不同的进程工作,您可以使用Messenger为服务创建一个界面。通过这种方式,服务定义了一个响应不同类型的Message对象的Handler。此Handler是Messenger的基础,然后可以与客户端共享IBinder,允许客户端使用Message对象向服务发送命令。此外,客户端可以定义自己的Messenger,以便服务可以发回消息。这是执行进程间通信(IPC)的最简单方法,因为Messenger将所有请求排队到一个线程中,这样您就不必将服务设计为线程安全的。
使用AIDL AIDL(Android界面定义语言)执行所有工作,将对象分解为操作系统可以理解的基元,并跨进程执行IPC以执行IPC。使用Messenger的先前技术实际上是基于AIDL作为其底层结构。如上所述,Messenger在单个线程中创建所有客户端请求的队列,因此服务一次接收一个请求。但是,如果您希望服务同时处理多个请求,则可以直接使用AIDL。在这种情况下,您的服务必须能够进行多线程并且构建为线程安全的。要直接使用AIDL,必须创建一个定义编程接口的.aidl文件。 Android SDK工具使用此文件生成一个抽象类,该类实现接口并处理IPC,然后您可以在服务中进行扩展。
除了文档所说的内容之外,AIDL实现还包括编写样板代码,用于编组和解组传输的数据(使用Parcelable接口),能够一次接收来自多个线程的请求,而Messenger将消息排队并执行繁重的工作,但在一个时间的要求。
对于Service-Activity交互,您应该使用异步回调机制。使用EventBus库,解决方法非常简单。它基本上使用广播接收器进行消息调度以及应用程序的不同组件之间的通信。 我强烈建议你看看this tutorial和链接,因为EventBus现在是android开发中使用最频繁的库。
广播接收器
信使:
参考:http://codetheory.in/android-interprocess-communication-ipc-messenger-remote-bound-services/ https://www.slideshare.net/yoni1984/ipc-aidl-sexy-not-a-curse
AIDL:
我推荐广播接收器。请查看j2emanue
https://stackoverflow.com/a/22567356/5682331的回答