内容提供者简介

 内容提供者ContentProvider是Android系统四大组件之一,用于保存和检索数据,是Android系统不同应用程序之间共享数据的接口。在Android系统中,应用程序之间是相互独立的,分别运行在自己的进程中,相互之间没有交换数据。如果应用程序之间需要共享数据,就需要用到ContentProvider了。

 ContentProvider是不同应用程序之间进行数据交换的标准API,它以URI形式对外提供数据,允许其它应用操作本应用的数据。其它应用程序则使用ContentResolver,并根据ContentProvider提共的URI操作指定的数据。

创建内容提供者

创建一个内容提供者

第一步:写一个类继承ContentProvider这个抽象类,重写它的方法,例如:UserProvider.java

    onCreate()创建ContentProvider时调用

query():根据传入的URI,查询指定条件下的数据

delete():删除

update():修改

insert():插入

第二步:在Android清单文件中注册这个内容提供者

<provider

android:name=”cn.itcast.user.provider.UserProvider”

android:authorities=”cn.itcast.user.provider.itcastdb”

android:exported="true"

/>

name表示内容提供者的全路径名

authorities表示其它应用程序访问本应用的内容提供者的URI,注意这个URI在整个Android

系统中要唯一,初学者在这里可以将URI理解为口令。

exported=true表示自愿暴露给第三方使用


URI简介

ContentProvider这个抽象类中的方法,多数方法需要其它应用程序访问者传入一个URI参数。URI是由三部份组件,分别是:schema、authorities、path,其中schema和authorities必写,schema固定为content://

Uri.parse(String)方法是将一个字符串转成URI对象,为了解析URI,Android提供了一个UriMatcher这个辅助类来匹配URI,常用方法如下:

1——UriMatcher(int code):创建UriMatcher时调用,参数表示如果访问者的路径错误,返回的code值

2——addURI(String authority,String path,int code):添加一组匹配规则,如果访问者的路径正确,返回code

3——int match(Uri):匹配URI与addURI中的路径是否相同,成功则返回addURI中的code值


访问内容提供者

ContentResolver的基本用法

我们手机中的很多Android应用,都对外提供了ContentProvider接口,例如:短信,只要我们知道系统短信应用的URI,就可以使用ContentResolver对象来访问系统短信应用了。

查询系统所有短信的URI为:content://sms

address:手机号

date:发送或接收短信的时间

body:发送或接收的内容

type:发送或接收的代码,接收为1号,发送是2号

如果要访问系统短信应用的话,需要在Android清单文件中配置如下权限:

<uses-permission android:name="android.permission.READ_SMS"/>

<uses-permission android:name="android.permission.WRITE_SMS"/>

内容观察者的使用

什么是内容观察者

当使用ContentProvider将数据共享出来之后,再使用ContentResolver查询ContentProvider共享出来的数据,是一种很常见的操作。如果应用程序需要实时监听ContentProvider共享的数据是否发生了变化,可以使用Android系统提供的内容观察者ContentObserver来实现。

内容观察者ContentObserver是用来观察指定URI所代表的数据。当ContentObserver观察到指定URI的数据发生变化时,就会触发ContentObserver的onChange()方法,此时在onChange()方法中使用ContentResolver可以查询到变化的最新数据。

ContentObserver内容观察者常用的方法如下: 

1——ContentObserver(Handler handler):构造方法,参数可以是主线程Handler(可更新UI)或任何Handler

2——onChange():当观察到的URI代表的数据发生变化时,会触发该方法

创建内容观察者:

1——创建一个普通类继承ContenObserver

2——重写onChange()方法