Контент-провайдеры

Это средство создания динамических паттернов с возможностью нечёткого матчинга. Этот способ необходим, когда вы не можете описать паттерн статически или когда данные для паттерна могут меняться во времени. Примерами такого варианта являются имена контактов телефонной книги или названия приложений.

В тэге pattern в атрибуте uri нужно указать Uri со схемой content://, который указывает, какой контент-провайдер использовать для формирования паттерна.

Таким образом можно формировать только паттерны верхнего уровня - т.е. те, которые описываются в самом модуле, а не в командах модуля.

Подробнее о контент-провайдерах в Android можно прочитать в соответствующей документации.

Как реализовать контент-провайдер

Как и в стандартном случае, вы должны описать ваш контент-провайдер в манифесте AndroidManifest.xml приложения

<provider android:name=".MyProvider"
          android:authorities=".content"
          android:exported="false"/>

В этом примере класс MyProvider должен реализовывать абстрактный класс android.content.ContentProvider. Вы можете не реализовывать методы insert, delete и update, т.к. провайдер будет использоваться ассистентом только для загрузки данных для формирования паттерна.

Примером паттерна, использующего такой контент-провайдер, может быть такой вариант

<pattern name="MyPattern" uri="content://com.example.content/mypattern"/>

Загрузка происходит при каждом запросе пользователя, который соответствует паттерну команды, использующему данный динамический паттерн.

Тип паттерна

Метод getType должен возвращать требуемый тип для паттерна.

Метод query

Этот метод должен возвращать Cursor, содержащий пары ключ-значение для всех элементов паттерна. Как правило, для этого используется курсор MatrixCursor. Каждая строка курсора должна содержать только две колонки:

Когда использовать контент-провайдеры

Следует помнить, что контент-провайдеры загружают данные всякий раз, когда матчится паттерн, а значит провайдер должен загружать небольшое количество данных и сам процесс загрузки не должен занимать длительное время.

Как правило, контент-провайдеры используются для получения данных, хранящихся локально на устройстве (базы данных, SharedPreferences и т.п.), либо на устройствах в высокоскоростной локальной интранет-сети.

Аннотаторы

Для использования больших объёмов данных, которые могут храниться на удалённых серверах, необходимо использовать аннотатор, URL которого можно указать в том же атрибуте uri. При матчинге текста матчер делает запрос на такой сервер, который возвращает дополнительные данные о сущностях, которые он смог отыскать в строке. Таким образом, сервер аннотатора используется как поисковая система, способная работать с большими объёмами данных и языковыми сущностями.

Таким образом, к примеру, работают сервисы "Кино" или "Спорт" в приложении "Ассистент на русском". Для этих сервисов на серверах хранятся названия всех фильмов, кинотеатров, спортивных клубов и имён всех спортсменов.

В данном версии руководства не описывается способ использования аннотаторов при разработке стороннего приложения. Данный функционал будет описан в следующих версиях документации API.