什么是IPC?
IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。那什么是进程,什么是线程,进程和线程是两个截然不同的概念。在操作系统中,线程是cpu调度的最小单元,同时线程是一种有限的系统资源。而进程指的一个执行单元,在pc和移动设备上指的是一个程序或一个应用。一个进程可以包含多个线程,因此进程和线程是包含被包含的关系,最简单情况下,一个进程可以只有一个线程,即主线程,在Android里面也叫UI线程,在UI线程里才能操作界面元素。
为什么要使用IPC?
- 要在不同应用间进行通信,android系统中每个应用是运行在独立的进程中;
- 运行在不同进程间四大组件,如果他们想要通过内存来共享数据,这样都会失败的,为什么?
如果某个进程向共享内存中写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程,但共享内存并没有提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取,这也是多进程所带来的主要影响。
正常情况下,四大组件中间不可能不通过一些中间层来共享数据,那么通过简单地指定进程名来开启多进程都会无法正确运行。一般来说,使用多进程会造成如下几方面的问题:
- 静态成员和单例模式完全失效
- 线程同步机制完全失效
- SharedPreferences的可靠性下降
- Application会多次创建
为了解决这个问题,我们就要使系统提供的IPC方法。
Binder
直观来说,Binder是Android中的一个类,它实现了IBinder接口。从IPC角度来说,Binder是Android中的一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux中没有。
从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager等等)和相应ManagerService的桥梁。从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。
为什么要用Binder?
//todo..
Android中的IPC方式
- 使用Bundler
- 使用文件共享
- 使用Messanger
- 使用AIDL
- 使用ContentProvider
- 使用Socket