Learn && Live
虚度年华浮萍于世,勤学善思至死不渝
前言
Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习、复盘过程,欢迎各位大佬阅读斧正!原创不易,转载请注明出处:http://t.csdn.cn/KVZ7C,话不多说我们马上开始!
1.ContentProvider
(1)ContentProvider是四大组件之一,底层实现为Binder。系统预置了许多ContentProvider,比如通讯录信息、日程表信息等,要跨进程访问这些信息,只需要通过ContentProvider的query、update、insert、delete方法即可。
(2)创建一个自定义ContentProvider需要继承ContentProvider类并实现六个抽象方法:onCreate、query、update、insert、delete和getType,其中onCreate代表ContentProvider的创建,一般用于初始化工作;getType用来返回一个Uri请求所对应的MIME类型,剩下四个方法对应于CRUD操作。这六个方法都运行在ContentProvider进程中,除了 onCreate 由系统回调并运行在主线程里,其他五个方法都由外界调用并运行在Binder线程池中。
(3)ContentProvider主要以表格的形式来组织数据,并且可以包含多个表,与数据库类似,行对应记录,列对应字段。此外,还支持文件数据,比如图片、视频等
(4)ContentProvider是通过Uri来区分外界要访问的数据集合,例如外界访问ContentProvider中的表,我们需要为它们定义单独的Uri和UriCode。根据UriCode,我们就知道要访问哪个表了。
(5)query、update、insert、delete四大方法存在多线程并发访问,因此方法内部要做好线程同步。若采用SQLite并且只有一个SQLiteDatabase,SQLiteDatabase内部已经做了同步处理。若是多个SQLiteDatabase或是采用List作为底层数据集,就必须做线程同步。
2.Socket
(1)Socket也称为“套接字”,分为流式套接字和用户数据报套接字两种,分别对应于TCP和UDP协议。Socket可以实现计算机网络中的两个进程间的通信,当然也可以在本地实现进程间的通信。
(2)在远程Service建立一个TCP服务,然后在主界面中连接TCP服务。服务端Service监听本地端口,客户端连接指定的端口,建立连接成功后,拿到 Socket 对象就可以向服务端发送消息或者接受服务端发送的消息。
(3)实际上socket不仅能实现进程间的通信,还可以实现设备间的通信(只要设备之间的IP地址互相可见)。
(4)使用Socket来进行通信,有两点需要注意
-
声明权限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
-
不能在主线程中访问网络,否则抛出异常NetWorkOnMainThreadException,并且会影响程序的相应效率
3.Binder连接池
那么如果项目庞大,有多个业务模块都需要使用AIDL进行IPC,随着AIDL数量的增加,我们不能无限制地增加Service,我们需要把所有AIDL放在同一个Service中去管理。
Binder连接池的工作原理如图
(1)服务端只有一个Service,把所有AIDL放在一个Service中,不同业务模块之间不能有耦合
(2)服务端提供一个 queryBinder 接口,这个接口能够根据业务模块的特征来返回响应的Binder对象给客户端
(3)不同的业务模块拿到所需的Binder对象就可以进行跨进程通信了
4.选用合适的IPC方式
名称 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Bundle | 简单易用 | 只能传输Bundle支持的数据类型 | 四大组件间的进程间通信 |
文件共享 | 简单易用 | 不适合高并发场景,并且无法做到进程间的即时通信 | 无并发访问,交换简单的数据且实时性不高 |
AIDL | 功能强大,支持一对多并发实时通信 | 使用稍复杂,需要处理好线程同步 | 一对多通信且有RPC需求 |
Messenger | 功能一般,支持一对多串行实时通信 | 不能很好处理高并发,不支持RPC,只能传输Bundle支持的数据类型 | 低并发的一对多即时通信,无RPC需求,或者无需返回结果的RPC需求 |
ContentProvider | 在数据源访问方面功能强大,支持一对多并发通信,可通过Call方法扩展其他操作 | 可以理解为受约束的AIDL,主要提供数据源的CRUD操作 | 一对多的进程间数据共享 |
Socket | 功能强大,支持一对多并发实时通信,可通过网络传输字节流 | 实现细节较繁琐,不支持直接的RPC | 网络数据交换 |