Как ContentResolver находит соответствующий ContentProvider? - PullRequest
2 голосов
/ 06 января 2011

Это глубокий магический вопрос. Я понимаю, что вызов метода ContentResolver принимает URI, специфичный для ContentProvider, но как на самом деле Android создает ассоциацию?

Я предполагаю, что задействован любой URI, соответствующий полномочиям, предоставляемым ContentProvider в AndroidManifest.xml. Отправляется ли запрос каждому провайдеру, содержащему эти полномочия? Если я попытаюсь создать провайдеров, чьи полномочия префиксируют другие полномочия, это будет проблемой?

Есть ли способ узнать, работает ли ContentProvider? Я думаю, что, возможно, фиктивный ответ на метод getType () будет указывать на жизнеспособность.

1 Ответ

6 голосов
/ 08 марта 2011

Класс ContentResolver поддерживает отображение из Полномочий контента в ContentProvider классы.Данные для этого сопоставления поступают из элементов <provider> файлов AndroidManifest.xml различных установленных приложений.ContentResolver использует это сопоставление, чтобы определить, какой класс Provider является правильным для использования для данного входящего URI. Думайте о ContentResolver как о подобном DNS.Он определяет, какой сервер (поставщик) является правильным для ответа на ваш запрос.

Только один ContentProvider будет соответствовать, потому что contentAuthorities (часть содержимого «тип имени домена»: тип uri) должны быть уникальными,Они не иерархические.Рассматривайте их как уникальную строку, которая должна точно соответствовать.Причина, по которой они выглядят иерархически, заключается в том, что они позволяют легко гарантировать уникальность, аналогично тому, как имена пакетов Java гарантируются уникальными.

Согласно разделу «Описание:» для документации тега :

Система Android определяет поставщиков контента по авторитетной части контента: URI. ДляНапример, предположим, что следующий Content URI передан ContentResolver.query ():

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

Схема content: идентифицирует данные как принадлежащие поставщику контента и органу (com.example.project.healthcareprovider) идентифицирует конкретного поставщика. Таким образом, полномочия должны быть уникальными. Как правило, как в этом примере, это полное имя подкласса ContentProvider. Часть пути URI может использоваться поставщиком содержимого для идентификацииопределенные подмножества данных, но эти пути не объявлены в манифесте

Что касается того, что происходит, когда вы делаете провайдера с contentAuthority, который идентичен другому ... Ну, вещи ломаются.откажется от установки любого пакета, который идет в секунду, говоря:

WARN / PackageManager: Не удается установить, поскольку имя провайдера com.xxx.Provider (в пакете com.xxx) уже используется com.zzz

Так что ... Не делайте этого.

Нет способа проверить, работает ли ContentProvider.Он запускается и останавливается автоматически ContentResolver по мере необходимости.Когда вы начнете делать запросы для определенного contentAuthority, будет запущен связанный поставщик, если он еще не запущен.Он будет автоматически остановлен ContentResolver, через некоторое время после простоя и, похоже, какое-то время может не понадобиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...