类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 会在一段时间后自动停止它,一旦它处于空闲状态,并且看起来可能暂时不需要它。