gpt4 book ai didi

android - ContentResolver 是如何定位到对应的 ContentProvider 的?

转载 作者:太空狗 更新时间:2023-10-29 16:24:53 25 4
gpt4 key购买 nike

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

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

有没有办法查看 ContentProvider 是否正在运行?我在想也许对 getType() 方法的虚拟响应会指示 active 。

最佳答案

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

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

根据 tag documentation 的“描述:”部分:

The Android system identifies content providers by the authority part of a content: URI. For example, suppose that the following URI is passed to ContentResolver.query():

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

The content: scheme identifies the data as belonging to a content provider and the authority (com.example.project.healthcareprovider) identifies the particular provider. The authority therefore must be unique. Typically, as in this example, it's the fully qualified name of a ContentProvider subclass. The path part of a URI may be used by a content provider to identify particular data subsets, but those paths are not declared in the manifest

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

WARN/PackageManager: Can't install because provider name com.xxx.Provider (in package com.xxx) is already used by com.zzz

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

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

关于android - ContentResolver 是如何定位到对应的 ContentProvider 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4616675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com