zoukankan      html  css  js  c++  java
  • 利用AIDL来实现由Binder进行进程间通信(IPC)

    转自http://blog.csdn.net/herbert5069/article/details/8050533

    在写这篇文章之前,我一直在思考这几个问题:

    问题1:为什么需要IPC?

    问题2:什么是Binder?

    问题3:什么是AIDL?

    问题4:IPC同Activity Intent, Broadcast, Content provider,Service之间有什么区别与联系?

    如果您能轻松回答所有问题,那么恭喜您已经学会抢答了^-^ 直接PASS。

    我想答案应该是这样的:

    1. 为什么需要 IPC? IPC即进程间通信,因为基于Linux的Android不支持从当前进程访问另一个进程的数据,需要用特定的途径去实现,Android使用Binder来实现进程间通信,具体应用场景一般为有一个独立运行的Service端,从客户端(一个独立进程)访问Service端(另一个独立进程),例如可以在后台运行的音乐播放Service,以及音乐播放控制界面(客户端)。

    2.Binder意思是包扎,把进程间包扎在一起,是Android的一种用实现IPC的方法,特点是只需要考贝一次内存,便可以实现跨进程的函数调用,效率较高,速度较快,(相对于Socket/管道/消息队列),具体参考这里

    3.AIDL是帮助实现Binder通信的一个工具,只要用几条简单的函数声明,AIDL就会帮忙生成一个JAVA文件,包括了一个Proxy和Stub的访问接口,以及用于它们之间通信的Parcel,并保证Parcel的输入输出的顺序一致性,其中Proxy用于客户端进程,Stub用于Service端进程,有经验的程序猿完全可以自己写出Proxy和Stub的代码,而不需要使用AIDL,很明显,我不是这样的人。同时,即使是有经验的程序猿,为了节省时间,也会选择使用AIDL,看Android源码便可见一斑。

    4.IPC同Activity Intent, Broadcast, Content provider,Service之间有什么区别与联系?

    在android系统中,没有一个公共的内存区域,供多个应用共享存储数据,ContentProvider实现多应用跨进程共享数据,而IPC指两个或多个程序间相互调用和通信,不但可以共享数据,还能共享某个公共函数,一个SERVICE可以有几个client端访问与调用。

    Intent可以携带一些数据打开另一个程序(进程),但无法进行进程间实时的通信。

    Broadcast可以实现大规模杀伤性广播喊话,但也无法进行双向的进程间交流,IPC(Binder)可以。

    Service是Android后台运行的程序,如果想同其进行交互,有几种方式一种是本地Service直接访问,一种是使用Messenger通信(基于AIDL),支持单线程,一种就是AIDL方式,支持多线程同时访问。

    好了,有了这些预备知识,我想我应该写点程序了,就写一个带控制端(客户端)的音乐播放器吧。

    为了节约时间,在GITHUB找了一个写了大半拉的音乐播放代码,大半拉我指功能完成,一堆BUG时程序的样子。 用AIDL改写了播放Service的接口,并写了一个简单的控制端,我喜欢开源,代码在https://github.com/herbertdai/Android-Music-Player,这个应用原先带有一个很酷的功能:可拖动的播放列表,这个做为K歌用再合适不过了,但是我估计K歌房里出现手机点歌还需要个4,5年的样子。除此之外,这个程序还有个对我来说特殊的功能:公司午睡终极武器==>>隔音催眠定时一体机,每天大约午睡30分钟,就选择10首歌(30分钟左右),戴上耳机开始在人声中被催眠,等10首歌放完后,音乐停止,随即由周围的“人肉人声闹钟”叫醒,所以总结一点,干IT民工的,得有个定制的音乐播放器:)

    关于如何使用AIDL,这里有文章写得很好。结合我的源码就可以看懂了。 

    REF0:http://blog.csdn.net/universus/article/details/6211589

    REF1: Parcel http://prasanta-paul.blogspot.com/2010/06/android-parcelable-example.html

    REF2:http://myqdroid.blog.51cto.com/2057579/394189



  • 相关阅读:
    DataGirdView 编辑项时的验证
    存储过程分面
    Android PopupWindow菜单
    Android ListView 中的checkbox
    Linq Group
    final关键字
    BroadcastReceiver
    Android Studio 快捷键
    Android Studio 基础知识
    黑客帝国代码雨实现
  • 原文地址:https://www.cnblogs.com/walccott/p/4957592.html
Copyright © 2011-2022 走看看