2

これは深刻な魔法の問題です。 ContentResolverメソッドを呼び出すとContentProvider固有のURIが使用されることを理解していますが、実際にアンドロイドはどのように関連付けを行いますか?ContentResolverはどのように対応するContentProviderを探しますか?

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

ContentProviderが実行されているかどうかを確認する方法はありますか?私はおそらく、getType()メソッドのダミーレスポンスが活性を示すと考えています。

+0

http://developer.android.com/guide/topics/providers/content-providers.html#urisumは、権限がURIから連絡先プロバイダを識別するためにどのように使用されるかについて説明します。私の質問の2番目の部分はまだ関連しています、名前の重複/拡張がある場合はどうなりますか? – phreed

答えて

6

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

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

Androidシステムが プロバイダ コンテンツの権限部分でコンテンツを識別:「説明パー

。URIたとえば、次のURIが渡されることを想定 にContentResolver.query():

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

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

で宣言さ ありませんそれは別のものと同じです...まあ、ものが壊れます。

は/ PackageManagerをWARN:(パッケージcom.xxx中)プロバイダ名com.xxx.Provider がすでにCOMで使用されているため、インストールできません具体的には、それは言って、第二に行く方のパッケージをインストールすることを拒否します.zzz

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

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

関連する問題