阅读书籍:《Android开发艺术探索》
作者:任玉刚
本文为阅读其中IPC相关章节所做的简单总结,相关示例代码来自于书中。
IPC相关
Messenger
1.远程service 创建Messenger对象: mMessenger,并通过onBind方法提供IBinder对象;
|
|
2.client 绑定远程 service,通过ServiceConnection对象获得IBinder对象, 再通过该IBinder对象获得Messenger对象1:cm1;
|
|
3.同时要用Handler创建一个新的Messenger对象,cm2,用来处理远程service返回的消息。用msg.replyTo = cm2 进行设置。之后通过cm1.send(msg)向远程service发送消息。远程service中的sm1接受消息并且处理。
3.sm1中Handler对象处理消息时, 可以通过msg.replyTo获取要回复的Messenger对象。使用msg.replyTo.send(msg), 即可在客户端Messenger对象cm2 的handler中进行消息的处理。
AIDL
- 创建 Bean, 实现Parcelable接口;
- 创建 Manager AIDL文件, 如果用到上述 Bean, 需要建立 Bean.AIDL, 并申明那个类为parcelable
|
|
Manager 的 aidl文件如下:
|
|
提供了供client调用的方法
之后编译运行一次, IDE自动生成Manager对应的同名java文件(根据此例为 IBookManager.java)。Eclipse位于gen目录下,Android Studio位于build/generated目录下
- 创建远程service。内部创建一个继承IBookManager.Stub的Binder对象, 实现其中的方法, 并通过onBind方法, 返回该Binder对象。
|
|
- client 创建ServiceConnection, 并进行bindService,通过onServiceConnected获得IBinder对象,并通过asInterface方法获得远程service中的IBookManager对象,即可对远程service的数据进行操作。
|
|
ContentProvider
一个提供跨进程访问数据的解决方案。
- 建立远端ContentProvider, 并在manifest中申明authority和name; 1234<providerandroid:authorities="cn.lankton.contentproviderdemo.book.provider"android:name=".BookProvider"android:process=":provider"/>
其中, authorities最为重要, 其是本地访问远端ContentProvider的唯一表识。
- 实现ContentProvider中的各类方法:oncreate、 insert、 delete、 update、 query、 getType等, 暴露对数据增删改查的能力;
- 在ContentProvider中, 可以通过UriMatcher, 将Uri子路径和int型绑定, 方便处理不同子路径的Uri。
|
|
接下来, 在本地访问远程数据
- 通过远程ContentProvider的authorities拼接Uri;
- 通过getContentResolver获得ContentResolver对象
- 通过该ContentResolover对象和上面的Uri对象,对远程的数据增删改查。(实际可以理解为调用远程ContentProvider的各种相应方法
|
|
需要注意:
ContentProvider的query, update, insert, delete四大方法存在多线程并发访问的。用同一个SQLiteDataBase对象可以实现同步, 但如果远程数据是List等情况,必须自己想办法保证同步。