利用AIDL来实现由Binder进行进程间通信(IPC)
2012-10-08 23:48
357 查看
在写这篇文章之前,我一直在思考这几个问题:
问题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:/article/2095914.html
REF1: Parcel http://prasanta-paul.blogspot.com/2010/06/android-parcelable-example.html
REF2:/article/7243085.html
问题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:/article/2095914.html
REF1: Parcel http://prasanta-paul.blogspot.com/2010/06/android-parcelable-example.html
REF2:/article/7243085.html
相关文章推荐
- 利用AIDL来实现由Binder进行进程间通信(IPC)
- 利用AIDL来实现由Binder进行进程间通信(IPC)
- 利用AIDL来实现由Binder进行进程间通信(IPC)
- 利用IPC通道进行进程间通信(C#)
- Android AIDL IPC实现进程间通信
- 进程间通信 IPC (Binder核心和AIDL)
- Android IPC机制(三)——利用AIDL实现跨进程通信
- 利用UNIX Domain Socket实现进程间通信(IPC)
- 【Android】17.5 利用Messenger实现进程间通信(IPC)
- AIDL 实现 IPC(进程间通信)
- IPC(一)利用纯Binder通信(非aidl)
- IPC进程间通信 - AIDL+Binder
- 使用aidl工具快速在应用层实现binder进程间通信
- Android进程间通信(IPC)之实现细节篇(一) Binder驱动
- Android内存共享、进程间高性能IO、手动实现 Binder IPC、Aidl例子
- 利用IPC通道进行进程间通信(C#)
- 利用IPC通道进行进程间通信(C#)
- Android进程间通信(IPC)之实现细节篇(一) Binder驱动
- 利用IPC通道进行进程间通信(C#)
- 安卓IPC之利用AIDL分析Binder的工作过程