大型项目必备IPC之其他IPC方式(二)
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680
IPC的6种方式
IPC是Inter-Process Communication的缩写,意为进程间通信或者跨进程通信,是指两个进程进行数据交换的过程。下面就介绍一下IPC 的几种方式:
1.Bundle
这种方式使用的是比较多的,也是很常见的。四大组件中的三大组件(Activity,BroadcaseReceiver,Service)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口,所以可以很方便的在不同进程间传输。这里就不再赘述了。
2.使用文件共享
共享文件也是一种不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据。这里也不再赘述。但有一点要注意:android系统是基于Linux的,使得其并发读/写文件可以没限制地进行,甚至两线程同时对同一文件进行写操作都是允许的,尽管这可能出问题。So,重点:文件共享方式适合在对数据同步要求不高的进程间进行通信,并且要妥善处理并发读/写问题。
3.Messenger
Messenger译为信使,顾名思义,主要作用就是传递消息。通过它可在不同进程中传递Message对象,在Message中放入要传递的数据,即可轻松地实现数据的进程间传递了。Messenger是一种轻量级的IPC方案,底层实现是AIDL。Messenger的使用方法很简单,他对AIDL做了封装,使得我们更简单的进行进程间通信。
使用Messenger,分为服务端和客户端:
(1)服务端进程
首先,需要在服务端创建一个Service 来处理客户端的连接请求,同时创建一个Handler(重写handleMessage方法处理接受的数据)并通过此Handler来创建一个Messenger对象,然后在Service的onBind中返回这个Messenger对象底层的 Binder即可。
(2)客户端进程
客户端进程中,首先需要绑定服务端的Service,绑定成功后,用服务端返回的IBinder对象来创建一个Messenger,然后通过Messenger就可以向服务端发送消息了,发送的消息类型为Message对象。【注:如果需要服务端能够 回应客户端,就和服务端一样,我们需要在客户端也创建一个Handler(重写handleMessage方法处理回传的数据)并创建一个新的Messenger,并把这个Messenger对象通过Message的replyTo参数传递给服务端,服务端通过这个replyTo参数就可以回应客户端】。
4.AIDL
上面说到Messenger,其是以串行的方式处理客户端发来的消息,如果有大量的并发请求,那么使用Messenger就不太合适了。同时Messenger主要作用就是传递消息,很多时候我们可能需要跨进程调用服务端的方法,这种情形Messenger就无法做到了,但是我们可以使用AIDL来实现跨进程的方法调用。下面就介绍一下AIDL的使用。
使用使用AIDL,也分为服务端和客户端:
(1)服务端
服务端首先要创建一个Service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后在这个Service中实现这个AIDL接口即可。
(2)客户端
客户端要做的事情稍微简单一些,首先需要绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL所属的类型,接着就可以调用AIDL中的方法了。
5.ContentProvider
ContentProvider是Android中提供的专门用于不同应用间进行数据共享的方式,从这一点,它天生就适合进程间通信。和Messenger一样,contentProvider的底层实现同样是Binder,由此可见,Binder在Android中是何等的重要。虽然ContentProvider底层是用Binder,但它的使用过程要比AIDL 简单许多,因为系统已经做了封装。
系统预置了许多ContentProvider,比如通讯录信息,日程变信息等,要跨进程访问这些信息,只需要通过ContentResolver的query、update、insert和delete方法即可。
使用:
创建一个自定义的ContentProvider很简单,只需要继承ContentProvider类并实现六个抽象方法即可:onCreate、query、update、insert、delete和getType。除了onCreate由系统回调并运行在主线程中,其他五个方法由外界回调并运行在Binder线程池中。
6.Socket
Socket 也称为“套接字”。是网络通信中的概念,它分为流式套接字和用户数据报套接字两种,分别对应于网络传输控制层中的TCP和UDP协议。TCP是面向连接的协议,提供稳定的双向通信功能,TCP连接的建立需要经过“三次握手”才能完成,为了提供稳定的数据传输功能,其本身提供了超时重传机制,因此具有很高的稳定性。而UDP是无连接的,提供不稳定的单向通信功能,当然UDP也能实现双向通信功能。在性能上,UDP 具有更高的效率,缺点是不保证数据一定能够正确传输,尤其是在网络阻塞的情况下。
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680