1、第六章 内容提供者创建内容提供者访问内容提供者内容观察者的使用 学习目标重点了解掌握创建内容提供者访问内容提供者12内容观察者的使用3 ContentProvider 工作原理 目录内容提供者简介6.16.1创建内容提供者 6.26.2访问内容提供者6.36.3点击查看本小节知识架构内容观察者的使用6.46.4点击查看本小节知识架构本章小结6.56.5点击查看本小节知识架构 知识架构6.2 创建内容提供者6.2.1创建一个内容提供者6.2.2Uri简介6.2.3案例读取联系人信息返回目录6.2 创建内容提供者 知识架构返回目录6.3 访问内容提供者6.3.1ContentResolver的基本
2、用法6.3.2案例短信备份 知识架构返回目录6.4 内容观察者的使用6.4.1什么是内容观察者6.4.2案例短信窃听器6.1 内容提供者简介什么是内容提供者?什么是内容提供者? 内容提供者(ContentProvider)是Android系统四大组件之一,用于保存和检索数据保存和检索数据,是Android系统中不同应用程序之间共享数据的共享数据的接口接口。 ContentProvider是不同应用程序之间进行数据交换的标准API,以Uri形式对外提供数据,允许其他应用操作本应用数据其他应用操作本应用数据。其他应用则使用ContentResolver,并根据ContentProvider提供的U
3、ri操作指定数据。6.1 内容提供者简介 内容提供者简介内容提供者简介6.2 创建内容提供者 6.2.1 创建一个内容提供者创建一个内容提供者。 定义一个类继承android.content包下的ContentProvider类(抽象类)。子类需要重写它的onCreate()、delete()、getType()、insert()、query()、update()这几个抽象方法。 ContentProvider是四大组件之一,必须要在清单文件中注册是继承于ContentProvider类的全路径名称表示访问本provider的路径,注意这里的路径必须要唯一。6.2 创建内容提供者 6.2.2
4、Uri简介简介 ContentProvider的几个抽象方法,这几个抽象方法中有一个参数Uri,它代表了数据的操作方法。Uri是由scheme、authorites、path三部分组成。scheme:“content:/”是一个标准的前缀,表明这个数据被内容提供者所 控制,它不会被修改;authorities:“cn.itcast.db.personprovider”是在清单文件中指定的android:authorities属性值,该值必须唯一,它表示了当前的内容提供者;path:“/person”代表资源(或者数据),当访问者需要操作不同数据时,这个部分是动态改变的6.2 创建内容提供者 6
5、.2.2 Uri简介简介 Uri.parse(String str)方法是将字符串转化成Uri对象对象的。为了解析Uri对象,Android系统提供了一个辅助工具类UriMatcher用于匹配Uri。 UriMatcher中的常用方法如表所示:方法名称方法名称方法说明方法说明public UriMatcher(int code)创建UriMatcher对象时调用,参数通常使用UriMatcher.NO_MATCH,表示路径不满足条件返回-1public void addURI(String authority, String path, int code)添加一组匹配规则,authority即
6、Uri的authoritites部分,path即Uri的path部分public int match(Uri uri)匹配Uri与addURI方法相对应,匹配成功则返回addURI方法中传入的参数code的值。6.2 创建内容提供者 6.2.3 案例案例读取联系人信息读取联系人信息 接下来通过一个案例“读取联系人信息”讲解如何使用内容提供者暴露数据。该案例实现了查询自己暴露的数据,并将数据捆绑到ListView控件中的功能。 在Android系统中,ContentResolver充当着桥梁的角色。应用程序通过ContentProvider暴露自己的数据,通过ContentResolver对应用
7、程序暴露的数据进行操作。 通过ContentResovler对象实现数据的操作代码如下:6.3 访问内容提供者 6.3.1 ContentResolver的基本用法的基本用法Uri uri = Uri.parse(content:/cn.itcast.db.personprovider/person);ContentResolver resolver = context.getContentResolver();Cursor cursor = resolver.query(uri, new String address, date,type, body , null, null, null);
8、while (cursor.moveToNext() String address = cursor.getString(0); .cursor.close();6.3 访问内容提供者 6.3.2 案例案例短信备份短信备份 为了让初学者更好地掌握ContentResolver的用法。本小节将通过一个案例“短信备份”来演示如何使用ContentResolver操作Android系统短信应用暴露的数据。 6.4 内容观察者的使用 6.4.1 什么是内容观察者什么是内容观察者 内容观察者(ContentObserver)是用来观察指定Uri所代表的数据。当ContentObserver观察到指定Ur
9、i代表的数据发生变化时,就会触发ContentObserver的onChange()方法。此时在onChange()方法里使用ContentResovler可以查询到变化的数据。从图可以看出,使用ContentObserver观察A应用的数据时,首先要在A应用的ContentProvider中调用ContentResolver的notifyChange()方法。调用了这个方法之后当数据发生变化时,它就会向“消息中心”发送数据变化的消息。然后C应用观察到“消息中心”有数据变化时,就会触发ContentObserver的onChange()方法。6.4 内容观察者的使用 6.4.1 什么是内容观察
10、者什么是内容观察者 接下来了解以下ContentObserver的几个常用方法,如表所示。方法名称方法名称方法说明方法说明void ContentObserver(Handler handler)ContentObserver的派生类都需要调用该构造方法。参数可以是主线程Handler(可以更新UI ),也可以是任何Handler对象。public void onChange(boolean selfChange)当观察到的Uri代表的数据发生变化时,会触发该方法。6.4 内容观察者的使用 6.4.1 案例案例短信接收器短信接收器 为了让初学者更好地掌握内容观察者,接下来将通过案例“短信接收器”来演示内容观察者的用法。本案例实现了窃听系统短信并将窃听到的短信显示在界面上的功能。 6.5 本章小结本章详细地讲解了内容提供者的相关知识,首先简单介绍了内容提供者,然后讲解了如何创建内容提供者以及访问其他程序暴露的数据。最后讲解内容观察者,通过内容观察者观察数据的变化。