Android 进程间通信的方式
- 使用 Intent
- 使用文件共享
- 使用 Messenger(基于Binder)
- 使用 AIDL(基于Binder)
- 使用 ContentProvider
- 使用 Socket
Socket socket = new Socket("localhost",8688);
ServerSocket serverSocket = new ServerSocket(8688);
为什么要使用Binder?
在传统的Linux上,我们还是有很多选择可以用来实现进程间通信,如管道、SystemV、Socket等。那么Android为什么不使用这些原有的技术,而是要使开发一种新的叫Binder的进程间通信机制呢?
主要有两个方面的原因:
- 性能方面
在移动设备上(性能受限制的设备,比如要省电),广泛地使用跨进程通信对通信机制的性能有严格的要求,Binder相对出传统的Socket方式,更加高效。Binder数据拷贝只需要一次,而管道、消息队列、Socket都需要2次,共享内存方式一次内存拷贝都不需要,但实现方式又比较复杂。 - 安全方面
传统的进程通信方式对于通信双方的身份并没有做出严格的验证,比如Socket通信ip地址是客户端手动填入,很容易进行伪造,而Binder机制从协议本身就支持对通信双方做身份校检,因而大大提升了安全性。
Binder运行机制
Binder基于Client-Server通信模式,除了Client端和Server端,还有两角色一起合作完成进程间通信功能。
Binder通信的四个角色:
- Client进程:使用服务的进程。
- Server进程:提供服务的进程。
- ServiceManager进程:ServiceManager的作用是将字符形式的Binder名字转化成Client中对该Binder的引用,使得Client能够通过Binder名字获得对Server中Binder实体的引用。
- Binder驱动:驱动负责进程之间Binder通信的建立,Binder在进程之间的传递,Binder引用计数管理,数据包在进程之间的传递和交互等一系列底层支持。
Server进程向Service Manager进程注册服务(可访问的方法接口),Client进程通过Binder驱动可以访问到Server进程提供的服务。
系统服务,与App 服务的区别
系统服务通过 ServiceManager 去注册并管理如:AMS、WMS、PKMS
APP通过的bindService启动的Binder服务其实是由ActivityManagerService负责管理
的。
Binder传输数据的大小限制
普通的由Zygote孵化而来的用户进程,Binder内存大小是小于1M的。