一、IPC进程间通信
IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢?
1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
3. 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4. 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
5. 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
6. 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
"Android虽然构建在Linux上面,但是在IPC(进程间)机制方面,没有利用Linux提供IPC机制,而是自己实现了一套轻量级的IPC机制——binder机制。并且Android Binder机制之上,Android框架提供了一套封装,可以实现对象代理 (在本地进程中代理远程进程的对象 )。“
“ Google为什么要采用这种方式呢,这取决于Binder通信方式 的高效率。 Binder通信是通过linux的binder driver来实现的,Binder通信操作类似线程迁移(thread migration),两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回 。Binder的用户空间为每一个进程维护着 一个可用的线程池,线程池用于处理到来的IPC以及执行进程本地消息,Binder通信是同步而不是异步。"
二、AIDL
AIDL - Android Interface Definition Language - Android 接口定义语言
因为在Android中,应用程序运行在各自独立的进程里。应用程序之间是不能访问对方的内存空间的。有时为了实现进程间的通信,要用到PCI机制。Android支持PCI机制,但是需要Android能读懂的序列化数据(marshaling/un marshaling of data).
AIDL就是为了描述这样的数据产生的,它是一种接口定义语言。语法类似JAVA,.aidl文件里面写的是公布给客户端接口声明。
三、客户端 服务器
这种方式主要基于远程代理设计模式,适合长时间的面向连接的直接对象方法调用。基本思想是在Client端和 Server端都增加一个代理(客户端称之为Stud,Server端称之为skeleton),调用请求由Stub封装并基于底层传输机制(IPC或者 网络等)传送到skeleton,skeleton解封装后,调用Server的方法,然后再反方向返回。 这种方式,可以使得Client对于远程对象的范围,就如同本地对象一样。
步骤
1.编写.aidl文件,声明是公布给客户端的接口。
2.在Service类里实现接口。
3.远程调用方调用接口方法。
四、实例

(1)定义AIDL,声明是公布给客户端的接口。
/src/com.marakana/IAdditionService.aidl
(2)实现远程服务器的方法
OnBind方法返回的IBind对象是要供远程调用方使用的。
如果你实现了.aidl文件,那么eclipse+aidl工具会自动为你生成一个同名的.java文件(IAdditionService.java)。
/src/com.marakana/AdditionService.java
(3) 远程调用方调用接口方法
我们用AIDLDemo Activity作为远程调用方来调用AdditionService的add方法。
先要实现一个ServiceConnection的类,重写onServiceConnected() 方法和 onServiceDiconnected()方法来与服务器建立和断开服务器。
/src/com.marakana/AIDLDemo.java
(4)界面布局
/res/layout/main.xml
参考
http://my.unix-center.net/~Simon_fu/?p=875
http://topic.csdn.net/u/20100625/10/D7B0CB89-EBAE-4218-A9A5-4D8226B8B6B2.html
http://marakana.com/forums/android/examples/48.html
http://www.javaeye.com/topic/655866
本文详细介绍了Android的IPC机制,重点讲解了AIDL(Android Interface Definition Language)及其工作原理,展示了如何创建和使用AIDL进行进程间通信。通过AIDL,可以实现在客户端和服务器之间进行远程方法调用,类似于本地对象调用。同时,文章提到了Android特有的Binder机制,解释了其高效率和同步通信的特点。

3019

被折叠的 条评论
为什么被折叠?



