使用Bundle
Bundle实现了Parcelable接口,可以在四大组建之间传递数据,使用Intent将Bundle传递过去,
Bundle支持的数据类型:
基本数据类型,实现parcel的数据类型,bundle等
使用文件共享数据
将对象序列化到文件系统,然后在另一个进程中进行反序列化,虽然得到的对象内容是一样的,但是不是同一个对象了,
该方式需要考虑并发读写的问题
使用Messager
Messager是Aidl实现的,服务端一次只处理一个请求,不存在线程同步问题
使用Messager:主要用于发送消息,
1.服务端,
服务端创建service,在其中创建Handler,用该handler创建Messager对象,并在onbind()中返回Messager的Binder.
2.客户端
1)绑定service, 用服务端返回的binder创建Messager,使用该Messager可以向服务端发送请求,服务端接收到后,使用handler进行处理,.
2)如果服务端需要给客户端发消息,那客户端需要创建handler,使用该handler创建messager,将messager作为replyto参数传给服务端,
使用aidl
如果有多个客户端发消息,messager处理不过来,aidl可以进行在线程池内运行,通过aidl客户端还可以调用服务端的方法,根据前一篇的Binder运行机制的讲解.使用aidl可以方便的创建Binder类用于service将自己的方法暴露给客户端,供客户端调用.
步骤:
服务端
1.创建service,创建实体类,实体类的aidl声明文件,接口的aidl文件,注意一下几点:
基本数据类型,String,CharSequence,List要求元素能被aidl支持,map同list,实现了parcelable的对象,aidl接口本身
在同一个包下的类也要导入到接口定义aidl中
不是基本数据类型的需要在方法的参数中表明 in out inout 表示输入还是输出
==接口定义中没有成员变量==
客户端和服务端的包结构要一样,否则不能反序列化,所以客户端和服务端都需要一份aidl相关的包
服务端的方法是在binder线程池中执行的需要使用线程同步的数据结构,如CopyOnwriteArrayLIst(),ConcurrentHashMap
2.在service中实现接口aidl生成的Binder接口.
3.在onbind中返回binder
客户端
1.绑定service,将服务端返回的service转换成aidl所属的类型,即service返回的BInder.asInterface();
aidl文件支持的数据类型是有限制的.
在客户端,远程服务之间实现观察者模式
当服务的数据改变时,自动通知客户端.
remoteCallList专门用于实现远程调用的观察者的类
权限验证,只允许具有权限的客户端调用服务端
1.ondbind中返回null
2.onTransact()返回false
3.permission验证
使用contentProvider
content provider 也是基于binder实现的ipc,系统对齐进行了封装,content provider的使用就不多说了.
主要注意,多线程请求时需要进行同步.
使用Socket
使用socket就是在本地使用tcp/udp协议选择不同的socket端口进行通信
使用广播
broadcasts can be used as a messaging system across apps and outside of the normal user flow.