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



  • 相关阅读:
    HDU 4611 Balls Rearrangement 数学
    Educational Codeforces Round 11 D. Number of Parallelograms 暴力
    Knockout.Js官网学习(简介)
    Entity Framework 关系约束配置
    Entity Framework Fluent API
    Entity Framework DataAnnotations
    Entity Framework 系统约定配置
    Entity Framework 自动生成CodeFirst代码
    Entity Framework CodeFirst数据迁移
    Entity Framework CodeFirst尝试
  • 原文地址:https://www.cnblogs.com/walccott/p/4957592.html
Copyright © 2011-2022 走看看