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的四大组件都可使用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 Gradle 常用使用场景实现方式的总结
- Android Gradle 常用使用场景实现方式的总结
- Android Gradle 常用使用场景实现方式的总结
- Android中ListView同过自定义布局并使用SimpleAdapter的方式实现数据的绑定
- Android的IPC机制实现方式之Messenger
- Android中的IPC方式——使用Messenger
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决
- android使用继承的方式实现底部菜单栏
- android(13)(sqlite的CRUD使用SQL和API两种方式实现以及Linearlayout的列表展示)
- android使用AIDL实现跨进程通讯(IPC)
- Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用
- Android中的IPC方式——使用Bundle和文件共享
- Android中使用4种方式实现按钮点击操作
- android使用AIDL实现跨进程通讯(IPC)
- Android进阶:AIDL实现IPC使用详解
- 通过RTLabel、RCLabel、FTCoreText及webView结合SDWebImage等4种方式实现左滑或下拉中cell中图文混排使用场景方案
- Android使用MultipartEntityBuilder实现类似form表单提交方式的文件上传
- Android 定时器的实现方式(TimerTask、Handler)及 Handler使用解析
- Android中实现IPC的几种方式详细分析及比较
- Android 使用Get方式实现断点下载(一)