不好意思,距离上次更新博客已经快两年了,网上很多介绍进程间通信的文章,而且当时有同事在组内分享过IPC方式,所以就没再写了,但是,还是大概总结一下吧。每个人都有自己的理解,在此就简单聊一下我的理解吧,好吧,直接进入主题。
1、Activity
Activity有显示启动和隐式启动,如果直接打开另外一个app的Avtivity可不可以呢,比如在淘宝上买个东西,跳转到支付宝去支付,就可以通过隐式启动的方式。
2、AIDL
一方面,服务端进程创建一个Service来监听客户端的连接请求,还需要创建一个AIDL文件,在这里声明需要暴露给客户端的接口,然后在Service中实现这个接口。另一方面,客户端进程绑定服务端的Service,将服务端返回的Binder对象转成AIDL接口所属的类型,然后就可以调用AIDL中的方法了。比如设置黑名单,来电的时候自动挂断,就是通过AIDL。
3、Messenger
Messenger可以理解为信使,在Messenger中放入数据,然后在不同进程间传递。它的底层实现是AIDL。使用时的大概思想就是在服务端进程创建Service,在这个Service中创建Messenger对象,在onBind中返回这个Messenger对象底层的Binder;客户端进程绑定Service,然后用服务端返回的IBinder对象创建一个Messager,就可以使用这个Messager向服务端发消息了。具体写法就不在这里贴了,大家可以在网上搜一下。
4、ContentProvider
ContentProvider的使用很简单,服务端定义增删改查,客户端通过uri的方式调用,比如通讯录、手机里的音乐列表都是通过ContentProvider提供服务的。
5、BroadcastReceiver
这就更简单了,一个进程发送广播,另一个进程接收广播。
6、Socket
一方通过ServerSocket提供服务,一方通过Socket请求服务,也能实现进程间通信,不过这种方式在实际应用中比较少。
7、文件共享
两个进程通过读/写同一个文件,也能交换数据,实现通信,不过要考虑并发的情况。另外,需要注意的是,Sharedpreferences是不安全的,系统对Sharedpreferences的读/写有一定的缓存策略,即在内存中会有一份Sharedpreferences文件的缓存,因此,多进程间使用它的时候是不可靠的。
前5个是不是可以理解为四大组件(其中AIDL和Messenger都是通过bindService实现的,从另外一个角度也可以理解为四大组件中的Service吧),而且它们的本质上都是基于Binder。对于Binder的理解,从Android Framework角度上讲,Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager等)和相应ManagerService的桥梁;从应用层来说,Binder是客户端和服务端进行通信的媒介,当bindService时,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。如果想彻底理解Binder,建议看一下Activity启动流程和AIDL实现原理,这两个内容分别对应Framework层和应用层。
这里只是简单的总结一下,没有具体的写法说明,如果想看一下AIDL和Messenger的写法,可以看一下这篇文章。
参考《Android开发艺术探索》