4

这是一个很深奥的问题。我知道对 ContentResolver 方法的调用需要一个特定于 ContentProvider 的 URI,但是 android 实际上是如何建立关联的?

我猜测任何与 AndroidManifest.xml 中 ContentProvider 提供的权限匹配的 URI 都涉及。请求是否发送到包含该权限的每个提供者?如果我尝试创建其权限以另一个权限为前缀的提供者,那会是一个问题吗?

有没有办法查看 ContentProvider 是否正在运行?我在想也许对 getType() 方法的虚拟响应会表明活跃度。

4

1 回答 1

7

ContentResolver维护从内容授权到ContentProvider类的映射。该映射的数据来自<provider>各种已安装应用程序的 AndroidManifest.xml 文件的元素。ContentResolver 使用此映射来识别哪个 Provider 类适合用于传入的给定 URI。将 ContentResolver 视为有点像 DNS。它会确定哪台服务器(提供商)最适合回答您的查询。

只有一个 ContentProvider 会匹配,因为 contentAuthorities(内容的“域名”部分:类型 uri)必须是唯一的。它们不是等级的。将它们视为必须完全匹配的唯一字符串。它们看起来分层的原因是允许一种简单的方法来保证唯一性,类似于确保 Java 包名称唯一的方式。

根据标签文档的“描述:”部分:

Android 系统通过内容的权限部分来识别内容提供者:URI。例如,假设将以下 URI 传递给 ContentResolver.query():

content://com.example.project.healthcareprovider/nurses/rn

content: 方案将数据标识为属于内容提供者,并且权限 (com.example.project.healthcareprovider) 标识特定提供者。因此,权限必须是唯一的。通常,如本例所示,它是 ContentProvider 子类的完全限定名称。内容提供者可以使用 URI 的路径部分来标识特定的数据子集,但这些路径未在清单中声明

至于当您使用与另一个相同的 contentAuthority 创建提供程序时会发生什么......嗯,东西坏了。具体来说,它将拒绝安装第二个软件包,并说:

WARN/PackageManager:无法安装,因为提供程序名称 com.xxx.Provider(在包 com.xxx 中)已被 com.zzz 使用

所以....不要那样做。

无法查看 ContentProvider 是否正在运行。ContentResolver 根据需要自动启动和停止它。当您开始对特定 contentAuthority 发出请求时,如果关联的提供程序尚未运行,它将启动。ContentResolver 会在一段时间后自动停止它,一旦它处于空闲状态,并且看起来可能暂时不需要它。

于 2011-03-08T15:42:35.303 回答