ContentResolver如何找到相应的ContentProvider?

时间:2011-01-06 15:42:04

标签: android android-contentprovider android-contentresolver

1 个答案:

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