答案 0 :(得分:6)
类ContentResolver
维护从内容权限到ContentProvider
类的映射。该映射的数据来自各种已安装应用程序的AndroidManifest.xml文件的<provider>
元素。 ContentResolver使用此映射来标识哪个Provider类是用于给定URI的正确类。将ContentResolver视为类似于DNS。它确定哪个服务器(提供者)是回答您的查询的正确服务器。
只有一个ContentProvider匹配,因为contentAuthorities(内容的“域名”部分:类型uri)必须是唯一的。它们不是等级的。将它们视为必须完全匹配的唯一字符串。它们看起来是分层的原因是允许一种简单的方法来保证唯一性,类似于确保Java包名称独特的方式。
根据 tag documentation的<说明:“部分:
Android系统识别内容 供应商的权威部分 内容:URI。例如,假设 将以下URI传递给 ContentResolver.query():
content://com.example.project.healthcareprovider/nurses/rn
内容:方案标识 数据属于内容 提供者和权威 (com.example.project.healthcareprovider) 标识特定提供者。 因此必须是权威 独特。通常,如在此示例中, 它是a的完全限定名称 ContentProvider子类。路径 URI的一部分可以由内容使用 提供商识别特定数据 子集,但那些路径不是 在清单中声明
当你使一个提供者的contentAuthority与另一个提供者相同时会发生什么......好吧,东西会中断。具体来说,它会拒绝安装第二个包,说:
WARN / PackageManager:无法安装,因为提供程序名称为com.xxx.Provider (在com.xxx包中)已经被com.zzz
使用
所以....不要这样做。
无法查看ContentProvider是否正在运行。它根据需要由ContentResolver自动启动和停止。当您开始请求特定contentAuthority时,如果关联的提供程序尚未运行,则将启动它们。它会被ContentResolver自动停止,一段时间后它会一直处于空闲状态,看起来它可能暂时不需要。