4

これは深い魔法の質問です。ContentResolverメソッドの呼び出しがContentProviderに固有のURIを取得することを理解していますが、Androidは実際にどのように関連付けを行いますか?

AndroidManifest.xmlのContentProviderで提供される権限に一致するURIが含まれていると思います。要求は、その権限を含むすべてのプロバイダーに送信されますか?権限が別の権限の前に付くプロバイダーを作成しようとすると、それは問題になりますか?

ContentProviderが実行されているかどうかを確認する方法はありますか?getType()メソッドのダミー応答が活気を示しているのではないかと思います。

4

1 に答える 1

7

クラスContentResolverは、コンテンツオーソリティからContentProviderクラスへのマッピングを維持します。そのマッピングのデータは、<provider>インストールされているさまざまなアプリケーションのAndroidManifest.xmlファイルの要素から取得されます。ContentResolverは、このマッピングを使用して、受信する特定のURIに使用するのに適切なプロバイダークラスを識別します。ContentResolverはDNSのようなものと考えてください。どのサーバー(プロバイダー)がクエリに答えるのに適しているかを判断します。

contentAuthorities(コンテンツの「ドメイン名」部分:uri型)は一意である必要があるため、一致するContentProviderは1つだけです。それらは階層的ではありません。それらを完全に一致する必要がある一意の文字列として扱います。それらが階層的に見える理由は、Javaパッケージ名が一意であることを保証する方法と同様に、一意性を保証する簡単な方法を可能にするためです。

タグドキュメントの「説明:」セクションごと:

Androidシステムは、コンテンツの権限部分であるURIによってコンテンツプロバイダーを識別します。たとえば、次のURIがContentResolver.query()に渡されたとします。

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

content:スキームは、データをコンテンツプロバイダーに属するものとして識別し、機関(com.example.project.healthcareprovider)は特定のプロバイダーを識別します。したがって、権限は一意である必要があります。通常、この例のように、これはContentProviderサブクラスの完全修飾名です。URIのパス部分は、特定のデータサブセットを識別するためにコンテンツプロバイダーによって使用される場合がありますが、それらのパスはマニフェストで宣言されていません

別のプロバイダーと同じcontentAuthorityを持つプロバイダーを作成するとどうなるかというと...まあ、物事は壊れます。具体的には、次のように言って、2番目に進むパッケージのインストールを拒否します。

警告/PackageManager:プロバイダー名com.xxx.Provider(パッケージcom.xxx内)がcom.zzzによってすでに使用されているため、インストールできません

だから....そうしないでください。

ContentProviderが実行されているかどうかを確認する方法はありません。必要に応じて、ContentResolverによって自動的に開始および停止されます。特定のcontentAuthorityのリクエストを開始すると、関連付けられたプロバイダーがまだ実行されていない場合は開始されます。ContentResolverによって自動的に停止されます。しばらくすると、アイドル状態になり、しばらくは必要ないように見えます。

于 2011-03-08T15:42:35.303 に答える