您的位置:首页 > 移动开发 > Android开发

Android中实现IPC的方式及使用场景

2017-02-19 09:00 281 查看
1.使用Bundle —-> 用于android四大组件间的进程间通信

android的四大组件都可使用Bundle传递数据 所以如果要实现四大组件间的进程间通信 完全可以使用Bundle来实现 简单方便

2.使用文件共享 —->用于单线程读写

这种方式在单线程读写的时候比较好用 如果有多个线程并发读写的话需要限制线程的同步读写

另外 SharePreference是个特例 它底层基于xml实现 但是系统对它的读写会基于缓存,也就是说再多进程模式下就变得不那么可靠了,有很大几率丢失数据

3.使用Messenger —->用于可存放在message中的数据的传递

使用这个方式可以在不同进程间传递message对象 这是一种轻量级的IPC方案 当传递的对象可以放入message中时 可以考虑用这种方式 但是msg.object最好不要放

因为不一定可以序列化

4.AIDL android 接口定义语言 —->主要用于调用远程服务的方法的情况 还可以注册接口

使用方法很简单

在服务端定义aidl文件 自动生成java文件 然后在service中实现这个aidl 在onbind中返回这个对象

在客户端把服务端的aidl文件完全复制过来 包名必须完全一致 在onServiceConnected方法 中 把 Ibinder对象 用asInterface方法转化成 aidl对象

然后调用方法即可

需要注意的地方:

在aidl文件中并不是支持所有类型

仅支持如下6种类型:

基本数据类型—- int long char boolean double

String charSequence

List 只支持ArrayList CopyOnWriteArrayList也可以。。 里面元素也必须被aidl支持

Map 只支持HashMap ConCurrentHashMap也可以 里面元素也必须支持aidl

Parcelable 所有实现了此接口的对象

AIDL 所有的AIDL接口 因此 如果需要使用接口 必须使用AIDL接口

其中自定义的类型和AIDL对象必须显示import进来 不管是不是在一个包中

如果AIDL文件中用到了自定义的Parcelable对象 必须创建同名的AIDL文件 并声明为Parcelable类型

AIDL文件中除了基本数据类型外 其他类型必须标上方向 in out inout

AIDL接口中只支持方法 不支持声明静态常量

在使用aidl时 最好把所有aidl文件都放在一个包中 这样方便复制到客户端

其实所有的跨进程对象传递都是对象的序列化与反序列化 所以必须包名一致
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android