AndroidAndroid知识Android技术知识

Android四大组件之ContentProvider

2017-03-21  本文已影响655人  程序员丶星霖

Android四大组件之ContentProvider

为了在应用程序之间交换数据,Android提供了ContentProvider,它是不同应用程序之间进行数据交换的标准API,当一个应用程序需要把自己的数据暴露给其他程序使用时,该应用程序就可通过提供ContentProvider来实现;其他应用程序就可通过ContentResolver来操作ContentResolver暴露的数据。

ContentProvider简介

ContentProvider是不同应用程序之间进行数据交换的标准API,ContentProvider以某种Uri的形式对外提供数据,允许其他应用访问或修改数据;其他应用程序使用COntentResolver根据Uri去访问操作指定数据。

一旦某个应用程序通过COntentProvider暴露了自己的数据操作接口,那么不管该应用程序是否启动,其他应用程序都可通过该接口来操作该应用程序的内部数据,包括增加数据、删除数据、修改数据、查询数据等。

ContentResolver只是提供数据的访问接口,并不是像网站一样对外提供完整的页面。开发一个ContentProvider的步骤如下所示:

  1. 定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类。
  2. 向Android系统注册ContentProvider,即在AndroidManifest.xml文件中注册这个ContentProvider,就想注册Activity一样。注册ContentProvider时需要为它绑定一个Uri。

除此之外,自己定义的ContentProvider类还需要提供如下几个方法:

Uri简介

ContentProvider要求的Uri与互联网的URL类似,例如如下Uri:

content://org.crazyit.providers.dictprovider/words

它可以分为如下三部分:

为了将一个字符串转换成Uri,Uri工具类提供了parse()静态方法。例如,如下代码即可将 字符串转换为Uri:

Uri  uri = Uri.parse("content://org.crazyit.providers.dictprovider/word/2")

ContentResolver操作数据

ContentProvider的作用是暴露可供操作的数据;其他应用程序则通过ContentProvider来操作ContentProvider所暴露的数据,ContentResolver相当于HttpClient。
Context提供了如下方法来获取ContentResolver对象:

一旦在程序中获得了ContentResolver对象之后,接下来就可调用ContentResolver的如下方法来操作数据了。

一般来说,ContentProvider是单实例模式的,当多个应用程序通过ContentResolver来操作ContentProvider提供的数据时,ContentResolver调用的数据操作将会委托给同一个ContentProvider处理。

ContentProvider与ContentResolver的关系

从ContentResolver、ContentProvider和Uri的关系来看,无论是ContentResolver,还是ContentProvider,它们所提供的增删改查方法的第一个参数都是Uri。也就是说,Uri是ContentProvider和ContentResolver进行数据交换的标识。ContentResolver对指定Uri执行增删改查的数据操作,但Uri并不是真正的数据中心,因此这些增删改查操作会委托给该Uri对应的ContentProvider来实现。

ContentProvider、Uri、ContentResolver三者之间的关系如下图所示:

0.jpg

以指定Uri为标识,ContentResolver可以实现“间接调用”ContentProvider的增删改查方法:

  1. 当A应用调用ContentResolver的insert()方法时,实际上相当于调用了该Uri对应的ContentProvider的insert()方法。
  2. 当A应用调用ContentResolver的update()方法时,实际上相当于调用了该Uri对应的ContentProvider的update()方法。
  3. 当A应用调用ContentResolver的delete()方法时,实际上相当于调用了该Uri对应的ContentProvider的delete()方法。
  4. 当A应用调用ContentResolver的query()方法时,实际上相当于调用了该Uri对应的ContentProvider的query()方法。

开发ContentProvider子类

开发ContentProvider只要如下两步:

  1. 开发一个ContentProvider子类,该子类需要实现query()、insert()、update()和delete()等方法。
  2. 在AndroidManifest.xml文件中注册该ContentProvider,指定android:authorities属性。

配置ContentProvider

只要为<applicaton.../>元素添加了<provider.../>子元素即可配置ContentProvider。例如如下的配置片段:

<provider
        android:name=".FirstProvider"
        android:authorities="org.crazyit.providers.firstprovider"
        android:exported="true"/>

配置ContentProvider时通常指定如下属性:

为了确定ContentProvider实际能处理的Uri,以及确定每个方法中Uri参数所操作的数据,Android系统提供了UriMatcher工具类,主要提供了如下两个方法:

Android还提供了一个ContentUris工具类,它是一个操作Uri字符串的工具类,提供了如下两个工具方法:

操作系统的ContentProvider

Android系统本身提供了大量的ContentProvider,使用ContentResolver操作系统的ContentProvider数据的步骤也是两步:

  1. 调用Context的getContentResolver()获取ContentResolver对象;
  2. 根据需要调用ContentResolver的insert()、delete()、update()和query()方法操作数据。

Android系统用于管理联系人的ContentProvider的几个Uri如下:

Android为多媒体提供的ContentProvider的Uri如下所示:

监听ContentProvider的数据改变

在之前的介绍中,只要导致了ContentProvider数据发生了改变,程序中就调用如下代码:

getContext().getContentResolver(),notifyChange(uri ,null);

为了在应用程序中监听ContentProvider数据的改变,需要利用Android提供的ContentObserver基类。监听ContentProvider数据改变的监听器需要继承ContentObserver类,并重写该基类所定义的onChange(boolean selfChange)方法--当所监听的ContentProvider数据发生改变时,该onChange()方法将会被触发。

为了监听指定ContentProvider的数据变化,需要通过ContentResolver向指定Uri注册ContentObserver监听器。ContentResolver提供了如下方法来注册监听器:

这个方法的三个参数分别表示:

提供程序访问的替代形式

提供程序访问的三种替代形式在应用开发的过程中十分重要:

好的,ContentProvider就介绍这些吧!!欢迎关注我的微信公众号!

我的微信公众号.jpg
上一篇 下一篇

猜你喜欢

热点阅读