在 Android 开发中,有时用户确实需要在应用之间进行数据的交换。我们知道 通过指定文件的操作模式为 Co nt ext . MODE _ WORLD _ READABLE 或 Co nt ext . MODE _ WORLD _ WRIT E A B LE 同样也可以对外共享数据。但是如果采用文件 操 作模式对 外共享 数据 , 数 据的访 问 方式 会 因数据存储的方式而不同,导致数据的访问方式无法统 一, 比如采用 x m l 文 件对外共享数据,需要进行 xml 解析才能读取数据 ; 采用 sharedpreferences 共 享 数据 , 需要使用 sharedpreferences API 读取数据。为此, Go o gle 提供了 ContentProvider ( 内容 提供 者 ) ,它可以实现统一的数据访 问 方式。 ContentProvider 常用类简介 ContentProvider (内容提供者)是 Android 中的四大组件之一,主要用于对外共享数据, 也 就是通过 ContenProvider 把应用中的数据共享给其他应用访问,其他应用可以通过 ContenProvider 对指定应用中的数据进行操作。 ContenProvider 分为系统的和自定义的,系统的例如联系人、图片等数据。内容提供者提供的数据可以存储于文件系统、 SOLite 数据库或其他方式。 当应用需要通过 ContentProvider 对外共享数据时,第一步需要继承 ContentProvider 并重写 下面 的方法。 需要被重写的 ContentProvider 类的主要方法 如下: p ublic bolean onCreate() 在创建 ContentProvider 时调用此方法 P u blic Cursor query(Uri uri , String args1, Sring str1, S t ring stringArgs) 用于更新指定 U r i 的 ContentProvider 中的数据 publi c i n t delete(Uri uri, String string, String stringArgs) 用于从指定 U r i 的 ContentProvider 中删除数据 public S t ring getType(Uri uri) 用于返回指定的 Uri 中数据的 MIME 类型 在这些方法中, getType ( Uri uri )方法比较难以理解。此方法会根据传进来的 URI 生成一个代表 MimeType 的字符串,而此字符串的生成也有规则 ∶ 如果是单条记录,应该返回以 vnd.android.cursor.item/ 为首的字符串。 如果是多条记录,应该返回以 vnd.android.cursor.dir/ 为首的字符串。 至于字符串 ” / ” 后的字符,可以随便定义。 这里考虑一个问题,即为什么我们返回的 MimeType 要以 vnd.android.cursor . item/ 或 vn d . android . cusor . di r / 开头。我们知道, MIME 类型其实就是一个字符串,中间用一个 " / " 来隔开, " / " 前面是系统识别的部分,相当于我们定义一个变量时的变量数据类型,通过这个 " 数据类型 " ,系统能够知道我们所要表示的是什么内容。 " / " 后面的就是我们自己定义的 " 变量名 " 。 第二步需要在 A ndro i d M an i fe s t.xml 中对 Co n te nt P r ovid er 进行配置 。 为了能让其他应 用找 到该 Co n te nt P r ovid er ,采 用 a u thorities (主机名 / 域名)对 Cont e nProvi d er 进行唯一标识, 可以 把 Co n te nt P r ovid er 看作一个 网站 , a u thorities 就是它的域名。同时,为了使其他应用能够 访问 到这个 Co n te nt P r ovid er , 将 android:exported 属性设置为 tr ue 。而发布的内容提供者可能会 被多 个应用使用,所以将 android:multiprocess 属性设置为 tr ue 。具体的做法就是将如下格式的放置于 application 节点下 :