内容提供与处理
Android号称提供了4大组件,分别是页面Activity、广播Broadcast、服务Service和内容提供器 ContentProvider。其中内容提供器是跟数据存取有关的组件,完整的内容组件由内容提供器 ContentProvider、内容解析器ContentResolver、内容观察器ContentObserver这三部分组成。
ContentProvider为App存取内部数据提供统一的外部接口,让不同的应用之间得以共享数据。像我们熟知的SQLite操作的是应用自身的内部数据库;文件的上传和下载操作的是后端服务器的文件;而 ContentProvider操作的是本设备其他应用的内部数据,是一种中间层次的数据存储形式。
在实际编码中,ContentProvider只是一个服务端的数据存取接口,开发者需要在其基础上实现一个具体 类,并重写以下相关数据库管理方法。
- onCreate:创建数据库并获得数据库连接。
- query:查询数据。
- insert:插入数据。
- update:更新数据。
- delete:删除数据。
- getType:获取数据类型。
这些方法看起来是不是很像SQLite?没错,ContentProvider作为中间接口,本身并不直接保存数据,而是通过SQLiteOpenHelper与SQLiteDatabase间接操作底层的SQLite。所以要想使用ContentProvider,首先得 实现SQLite的数据表帮助类,然后由ContentProvider封装对外的接口。
内容解析器ContentResolver
前面提到了利用ContentProvider实现服务端App的数据封装,如果客户端App想访问对方的内部数据, 就要通过内容解析器ContentResolver访问。
内容解析器是客户端App操作服务端数据的工具,相对应的内容提供器是服务端的数据接口。要获取ContentResolver对象,在Activity代码中调用getContentResolver方法即可。
ContentResolver提供的方法与ContentProvider是一一对应的,比如query、insert、update、delete、 getType等方法,连方法的参数类型都一模一样。其中,最常用的是query函数,调用该函数返回一个游标 Cursor对象,这个游标与SQLite的游标是一样。
下面是query方法的具体参数说明(依顺序排列)。
- uri:Uri类型,可以理解为本次操作的数据表路径。
- projection:字符串数组类型,指定将要查询的字段名称列表。
- selection:字符串类型,指定查询条件。
- selectionArgs:字符串数组类型,指定查询条件中的参数取值列表。
- sortOrder:字符串类型,指定排序条件
在实际开发中,普通App很少会开放数据接口给其他应用访问,作为服务端接口的ContentProvider基本 用不到。内容组件能够派上用场的情况往往是App想要访问系统应用的通信数据,比如查看联系人、短信、 通话记录,以及对这些通信信息进行增、删、改、查。
内容观察器ContentObserver
ContentResolver获取数据采用的是主动查询方式,有查询就有数据,没查询就没数据。
有时我们不但要获取以往的数据,还要实时获取新增的数据,最常见的业务场景是短信验证码。电商App经常在用户注册或付款时发送验证码短信,为了给用户省事,App通常会监控手机刚收到的验证码数字,并自动填入验证码输入框。这时就用到了内容观察器ContentObserver,给目标内容注册一个观察器,目标内容的数据一旦发生变化,观察器规定好的动作马上触发,从而执行开发者预先定义的代码。
内容观察器的用法与内容提供器类似,也要从ContentObserver派生一个观察器类,然后通过 ContentResolver对象调用相应的方法注册或注销观察器。下面是ContentResolver与观察器有关的方法说明。
- registerContentObserver:注册内容观察器。
- unregisterContentObserver:注销内容观察器。
- notifyChange:通知内容观察器发生了数据变化。