Forver.微笑

面带微笑未必真的开心,但笑起的那一刻,心中的那些不开心的事已经不重要了~

0%

ContentProvider基础

Activity是Android四大组件之一,主要用于应用间共享数据。ContentProvider底层实现是Binder,,从这一点看它天生适合进程间通信(进程内通信也可用)。

优点

  • 安全
  • 统一了数据访问方式,访问简单高效
  • 系统预置了许多ContentProvider,比如通讯录信息,日程表等。

相关概念

使用ContentProvider需要先了解一些概念

URI

uri

MIME

全称Multipurpose Internet Mail Extensions,多功能Internet邮件扩充服务。它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
由类型和子类型组成:

1
2
3
4
5
6
text/html
// 类型 = text、子类型 = html

text/css
text/xml
application/pdf

MIME可以指定打开什么应用:
Activity的有个属性mimeType,当隐式启动Activity在Intent使用setData指定MIME与mimeType相匹配时,打开对应的Activity
在android中,MIME是这么规定的

  • 必须以vnd开头
  • 如果是多条记录,后面接android.cursor.dir/,如果是单条记录,后面接android.cursor.item/
  • 最后 加上”vnd.<authority>.<path>“

例子:
对于”content://<authority>/books”这个uri,它对应的类型就可以写成“vnd.android.cursor.dir/vnd.<authority>.books”;

使用步骤

  • 继承ContentProvider类,实现onCreate,query,insert,delete,update,getType(返回MIME类型)6个方法

  • 在AndroidManifest.xml中进行注册

    1
    2
    3
    4
    5
    <provider
    android:name=".contentProvider.BookProvider"
    android:authorities="com.ronaln.processdemo.provider"
    android:permission="com.ronaln.processdemo.provider"
    android:process=":provider" />

    android:authorities: 唯一标识,一般使用<包名>.provider
    android:permission: 声明权限,外界使用需要访问BookProvider,需要声明权限才可用

  • 通过ContentResolver调用query,insert,delete,update方法更新和查询数据

相关类

ContentProvider

  • 核心方法query,insert,delete,update操作数据
  • 首次使用会执行onCreate方法
  • getType方法
  • 除了onCreate方法运行在主线程里,不能做耗时操作,其他5个方法均有外界回调并运行在Binder线程池中
  • ContentProver可以管理文件(图片,视频,使用MediaStore类实现),表格数据(原生可以使用SQLiteOpenHelper实现),知识表格用的更多一些。

    ContentResolver

    无论应用定义了多少个ContentProvider,可以由ContentResolver统一管理使用,而无需关注每个ContentProvider细节。

    ContentUris

    操作uri

    UriMatch

    注册uri,通过uri匹配数据

    ContentObserver

例子ProcessDemo

参考文章:

MIME