Connor学Android - IPC方式之ContentProvider、Socket、Binder连接池

在这里插入图片描述

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网络数据交换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ConnorYan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值