クラス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によって自動的に停止されます。しばらくすると、アイドル状態になり、しばらくは必要ないように見えます。