本篇将介绍IPC方式的一些重点
一 使用Bundle
我们直到,四大组件中的三大组件(Activity、Service、Receiver)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口,由于Bundle实现了Parcelable接口,所以它可以方便地在不同的进程间传输。
传输的数据必须能够序列化,比如基本类型、实现Parcelable接口的对象,实现了Serializable接口的对象以及一些Android支持的特殊对象。
除了直接传递数据这种典型的使用场景,它还有一种特殊的使用场景。这种方式的核心思想在于将原本需要在A进程的计算任务转移到B进程的后台Service中去执行,避免了A进程在计算,不能把计算结果传递给要启动的B进程里。
二 使用文件共享
共享文件也是一种不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据,比如A进程把数据写入文件,B进程通过读取这个文件来获取数据。由于Android系统基于Linux,使得其并发读/写文件可以没有限制地进行,甚至两个线程同时对同一个文件进行写操作都是允许的。
通过文件共享这种方式来共享数据对文件格式是没有具体要求的,比如可以是文本文件,也可以是XML文件,只要读/写双方约定数据格式即可。通过文件共享的方式也是有局限性的,比如并发读/写的问题。
三 使用Messenger
通过Messenger可以在不同进程中传递Messenger对象,在Messenger中放入我们需要传递的数据,就可以轻松地实现数据的进程间传递了。Messenger是一种轻量级的IPC方案,它的底层实现是AIDL。
下面是Messenger的两个构造方法
public Messenger(Handler target){
mTarget = target。getIMessenger()
}
public Messenger(IBinder target){
mTarget=IMessenger。Stub。asInterface(target);
}
实现Messenger有如下几个步骤,分为服务端和客户端
1.服务端进程
首先,我们需要在服务端创建一个Service来处理客户端的连接请求,同时创建一个Handler并通过它来创建一个Messenger对象,然后在Service的onBind中返回这个Messenger对象底层的Binder即可。
2.客户端进程
客户端进程中,首先要绑定服务端的Service,绑定成功后用服务端返回的IBinder对象创建一个Messenger,通过这个Messenger就可以向服务端发送信息,发消息类型为Message对象。如果需要服务端能够回应客户端,就和服务端一样,我们还需要创建一个Handler并创建一个新的Messenger,并把这个Messenger对象通过Message的replyTo参数传递给服务端,服务端通过这个replTo参数就可以回应客户端。
四使用AIDL
AIDL也是Messenger的底层实现,可以用来跨进称调用服务端。
进程间通信的流程,分为服务端和客户端两个方面。
1.服务端
服务端首先要创建一个Service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后在Service中实现这个AIDL接口即可
2.客户端
客户端要做的事就简单一些,首先需要绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,接着就可以调用AIDL中的方法了。
五使用ContentProvider
ContentProvider的底层实现同样也是Binder。系统已封装好使用起来十分简单,
系统预置了许多ContentProvider,比如通讯录信息、日程表信息等,要跨进程访问这些消息,只需要通过ContentResolver的query、update、insert和delet方法即可。
六使用Socket
Socket也称为“套接字”,是网络通信的概念,它分为流失套接字和用户数据包套接字两种,分别对应于网络的传输控制层的TCP和UDP协议。
一般用于设计我们的聊天室程序,首先在远程Service建立一个TCP服务,然后在主界面中连接TCP服务,连接上了以后,就可以给服务端发消息了。使用Socket的工作机制。
参考:《Andoird开发艺术探索》