Добавить предложения пользовательского поиска

При использовании диалогового окна поиска Android или виджета поиска вы можете предоставлять персонализированные поисковые предложения, созданные на основе данных вашего приложения. Например, если ваше приложение представляет собой словарь, вы можете предлагать слова из словаря, соответствующие тексту, введенному в поле поиска, прежде чем пользователь завершит ввод запроса. Эти предложения ценны, потому что они могут эффективно предсказать, чего хочет пользователь, и обеспечить к этому мгновенный доступ. На рис. 1 показан пример диалогового окна поиска с настраиваемыми предложениями.

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

Прежде чем добавлять собственные предложения, внедрите диалоговое окно поиска Android или виджет поиска для поиска в своем приложении. См. раздел Создание интерфейса поиска и Поставщики контента .

Основы

Рисунок 1. Снимок экрана диалогового окна поиска с настраиваемыми предложениями поиска.

Когда пользователь выбирает индивидуальное предложение, система отправляет Intent в вашу активность поиска. В отличие от обычного поискового запроса, который отправляет намерение с помощью действия ACTION_SEARCH , вместо этого вы можете определить свои собственные предложения для использования ACTION_VIEW — или любого другого действия с намерением — а также включить данные, относящиеся к выбранному предложению. В примере со словарем, когда пользователь выбирает предложение, приложение может немедленно открыть определение этого слова вместо поиска совпадений в словаре.

Чтобы предоставить персонализированные предложения, выполните следующие действия:

  • Реализуйте базовое действие поиска, как описано в разделе Создание интерфейса поиска .
  • Измените конфигурацию с возможностью поиска, указав информацию о поставщике контента, который предоставляет специальные предложения.
  • Создайте таблицу, например в SQLiteDatabase , по вашим предложениям и отформатируйте ее с использованием необходимых столбцов.
  • Создайте поставщика контента , имеющего доступ к вашей таблице предложений, и объявите его в своем манифесте.
  • Объявите тип Intent , которое будет отправлено, когда пользователь выбирает предложение, включая настраиваемое действие и настраиваемые данные.

Система Android отображает не только диалоговое окно поиска, но и ваши поисковые предложения. Вам нужен поставщик контента, от которого система сможет получать ваши предложения. Прочтите «Поставщики контента» , чтобы узнать, как создать поставщика контента.

Когда система определяет, что ваша деятельность доступна для поиска, и предлагает варианты поиска, при вводе пользователем запроса происходит следующая процедура:

  1. Система берет текст поискового запроса — то есть все, что уже введено — и выполняет запрос вашему контент-провайдеру, который управляет вашими предложениями.
  2. Ваш поставщик контента возвращает Cursor , указывающий на все предложения, соответствующие тексту поискового запроса.
  3. Система отображает список предложений, предоставленных Cursor .

После отображения пользовательских предложений может произойти следующее:

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

Измените конфигурацию поиска

Чтобы добавить поддержку пользовательских предложений, добавьте атрибут android:searchSuggestAuthority к элементу <searchable> в файле конфигурации с возможностью поиска, как показано в следующем примере:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.MyCustomSuggestionProvider">
</searchable>

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

Создайте поставщика контента

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

Когда пользователь вводит текст в диалоговое окно поиска или виджет поиска, система запрашивает предложения у вашего контент-провайдера, вызывая query() каждый раз, когда вводится буква. В вашей реализации query() ваш поставщик контента должен выполнить поиск данных вашего предложения и вернуть Cursor , указывающий на строки, которые он считает хорошими предложениями.

Подробности о создании поставщика контента для пользовательских предложений обсуждаются в следующих двух разделах:

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

Обработка запроса на предложение

Когда система запрашивает предложения у вашего поставщика контента, она вызывает метод query() вашего поставщика контента. Реализуйте этот метод для поиска данных о предложениях и возврата Cursor , указывающего на предложения, которые вы считаете релевантными.

Вот сводка параметров, которые система передает вашему методу query() , перечисленные по порядку:

  1. uri

    Всегда Uri содержимого, отформатированный следующим образом:

    content://your.authority/optional.suggest.path/SUGGEST_URI_PATH_QUERY
    

    По умолчанию система передает этот URI и добавляет к нему текст запроса:

    content://your.authority/optional.suggest.path/SUGGEST_URI_PATH_QUERY/puppies
    

    Текст запроса в конце кодируется с использованием правил кодирования URI, поэтому вам может потребоваться декодировать его перед выполнением поиска.

    Часть optional.suggest.path включается в URI только в том случае, если вы установили такой путь в файле конфигурации с возможностью поиска с помощью атрибута android:searchSuggestPath . Это необходимо только в том случае, если вы используете одного и того же поставщика контента для нескольких действий с возможностью поиска. В этом случае устраните неоднозначность источника запроса на предложение.

  2. projection
    Всегда ноль.
  3. selection
    Значение, указанное в атрибуте android:searchSuggestSelection вашего файла конфигурации с возможностью поиска, или значение null, если вы не объявили атрибут android:searchSuggestSelection . В следующем разделе это обсуждается подробнее.
  4. selectionArgs
    Содержит поисковый запрос в качестве первого и единственного элемента массива, если вы объявите атрибут android:searchSuggestSelection в конфигурации с возможностью поиска. Если вы не объявите android:searchSuggestSelection , этот параметр будет иметь значение null. В следующем разделе это обсуждается подробнее.
  5. sortOrder
    Всегда ноль.

Система может отправить вам текст поискового запроса двумя способами. По умолчанию текст запроса включается в качестве последнего пути URI контента, передаваемого в параметре uri . Однако если вы включаете значение выбора в атрибут android:searchSuggestSelection вашей конфигурации с возможностью поиска, тогда текст запроса вместо этого передается как первый элемент массива строк selectionArgs . Эти два варианта описаны далее.

Получить запрос в Uri

По умолчанию запрос добавляется как последний сегмент параметра uri — объекта Uri . В этом случае для получения текста запроса используйте getLastPathSegment() , как показано в следующем примере:

Котлин

val query: String = uri.lastPathSegment.toLowerCase()

Ява

String query = uri.getLastPathSegment().toLowerCase();

Это возвращает последний сегмент Uri , который представляет собой текст запроса, который вводит пользователь.

Получите запрос в аргументах выбора

Вместо использования URI, возможно, было бы разумнее, если бы ваш метод query() получал все, что ему нужно для выполнения поиска, и вы могли бы захотеть, чтобы параметры selection и selectionArgs содержали соответствующие значения. В этом случае добавьте атрибут android:searchSuggestSelection в конфигурацию с возможностью поиска с помощью строки выбора SQLite. В строке выбора включите вопросительный знак ( ? ) в качестве заполнителя для фактического поискового запроса. Система вызывает query() используя строку выбора в качестве параметра selection и поисковый запрос в качестве первого элемента массива selectionArgs .

Например, вот как можно сформировать атрибут android:searchSuggestSelection для создания оператора полнотекстового поиска:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.MyCustomSuggestionProvider"
    android:searchSuggestIntentAction="android.intent.action.VIEW"
    android:searchSuggestSelection="word MATCH ?">
</searchable>

В этой конфигурации ваш метод query() доставляет параметр selection в виде "word MATCH ?" и параметр selectionArgs в качестве поискового запроса. Когда вы передаете их методу SQLite query() в качестве соответствующих аргументов, они синтезируются вместе, то есть вопросительный знак заменяется текстом запроса. Если вы получаете запросы на предложения таким образом и вам необходимо добавить подстановочные знаки в текст запроса, добавьте их или префикс к selectionArgs , поскольку это значение заключено в кавычки и вставлено вместо вопросительного знака.

Другой атрибут в предыдущем примере — android:searchSuggestIntentAction , который определяет действие намерения, отправляемое с каждым намерением, когда пользователь выбирает предложение. Это обсуждается далее в разделе «Объявление о намерении предложить предложения» .

Создайте таблицу предложений

Когда вы возвращаете предложения в систему с помощью Cursor , система ожидает определенные столбцы в каждой строке. Независимо от того, храните ли вы данные своих предложений в базе данных SQLite на устройстве, базе данных на веб-сервере или в другом формате на устройстве или в Интернете, отформатируйте предложения как строки в таблице и представьте их с помощью Cursor .

Система понимает несколько столбцов, но обязательны только два из них:

_ID
Уникальный целочисленный идентификатор строки для каждого предложения. Это требуется системе для представления предложений в ListView .
SUGGEST_COLUMN_TEXT_1
Строка, представленная как предложение.

Все следующие столбцы являются необязательными. Большинство из них обсуждаются далее в следующих разделах.

SUGGEST_COLUMN_TEXT_2
Строка. Если ваш Cursor содержит этот столбец, все предложения предоставляются в двухстрочном формате. Строка в этом столбце отображается как вторая, меньшая строка текста под основным текстом предложения. Оно может быть нулевым или пустым, чтобы указать отсутствие вторичного текста.
SUGGEST_COLUMN_ICON_1
Рисуемый ресурс, контент или строка URI файла. Если ваш Cursor содержит этот столбец, то все предложения предоставляются в формате «значок плюс текст» с рисуемым значком слева. Это значение может быть нулевым или нулевым, что указывает на отсутствие значка в этой строке.
SUGGEST_COLUMN_ICON_2
Рисуемый ресурс, контент или строка URI файла. Если ваш Cursor содержит этот столбец, то все предложения предоставляются в формате «значок плюс текст» со значком справа. Это значение может быть нулевым или нулевым, что указывает на отсутствие значка в этой строке.
SUGGEST_COLUMN_INTENT_ACTION
Строка действия с намерением. Если этот столбец существует и содержит значение в данной строке, определенное здесь действие используется при формировании намерения предложения. Если элемент не указан, действие берется из поля android:searchSuggestIntentAction в вашей конфигурации с возможностью поиска. Если ваше действие одинаково для всех предложений, эффективнее указать действие с помощью android:searchSuggestIntentAction и опустить этот столбец.
SUGGEST_COLUMN_INTENT_DATA
Строка URI данных. Если этот столбец существует и содержит значение в данной строке, эти данные используются при формировании намерения предложения. Если элемент не указан, данные берутся из поля android:searchSuggestIntentData в вашей конфигурации с возможностью поиска. Если ни один источник не указан, поле данных намерения имеет значение NULL. Если ваши данные одинаковы для всех предложений или могут быть описаны с помощью постоянной части и определенного идентификатора, более эффективно указать их с помощью android:searchSuggestIntentData и опустить этот столбец.
SUGGEST_COLUMN_INTENT_DATA_ID
Строка пути URI. Если этот столбец существует и содержит значение в данной строке, то «/» и это значение добавляется к полю данных в намерении. Используйте это только в том случае, если для поля данных, указанного атрибутом android:searchSuggestIntentData в конфигурации с возможностью поиска, уже установлена ​​соответствующая базовая строка.
SUGGEST_COLUMN_INTENT_EXTRA_DATA
Произвольные данные. Если этот столбец существует и содержит значение в данной строке, это дополнительные данные, используемые при формировании намерения предложения. Если оно не указано, дополнительное поле данных намерения имеет значение NULL. Этот столбец позволяет предложениям предоставлять дополнительные данные, которые включаются в ключ EXTRA_DATA_KEY намерения.
SUGGEST_COLUMN_QUERY
Если этот столбец существует и этот элемент существует в данной строке, это данные, которые используются при формировании запроса предложения и включаются в качестве дополнительного в ключ QUERY намерения. Это обязательно, если действие предложения — ACTION_SEARCH , но необязательно в противном случае.
SUGGEST_COLUMN_SHORTCUT_ID
Используется только при предоставлении предложений для окна быстрого поиска. В этом столбце указывается, нужно ли сохранять предложение поиска как ярлык и нужно ли его проверять. Ярлыки обычно создаются, когда пользователь нажимает на предложение в окне быстрого поиска. Если он отсутствует, результат сохраняется как ярлык и никогда не обновляется. Если установлено значение SUGGEST_NEVER_MAKE_SHORTCUT , результат не сохраняется как ярлык. В противном случае идентификатор ярлыка используется для проверки актуальности предложения с помощью SUGGEST_URI_PATH_SHORTCUT .
SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING
Используется только при предоставлении предложений для окна быстрого поиска. В этом столбце указано, что вместо значка из SUGGEST_COLUMN_ICON_2 должен отображаться счетчик, пока ярлык этого предложения обновляется в окне быстрого поиска.

Большинство из этих столбцов обсуждаются далее в следующих разделах.

Объявить о намерении получать предложения

Когда пользователь выбирает предложение из списка, который появляется под диалоговым окном поиска или виджетом, система отправляет пользовательское Intent в вашу активность поиска. Вы должны определить действие и данные для намерения.

Объявить намеренное действие

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

В зависимости от того, хотите ли вы, чтобы все предложения использовали одно и то же действие намерения, вы можете определить действие двумя способами:

  • Используйте атрибут android:searchSuggestIntentAction файла конфигурации с возможностью поиска, чтобы определить действие для всех предложений, как показано в следующем примере:
    <?xml version="1.0" encoding="utf-8"?>
    <searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_label"
        android:hint="@string/search_hint"
        android:searchSuggestAuthority="com.example.MyCustomSuggestionProvider"
        android:searchSuggestIntentAction="android.intent.action.VIEW" >
    </searchable>
    
  • Используйте столбец SUGGEST_COLUMN_INTENT_ACTION , чтобы определить действие для отдельных предложений. Для этого добавьте столбец SUGGEST_COLUMN_INTENT_ACTION в таблицу предложений и для каждого предложения поместите в него действие, которое нужно использовать, например "android.intent.action.VIEW" .

Вы также можете комбинировать эти две техники. Например, вы можете включить атрибут android:searchSuggestIntentAction с действием, которое будет использоваться со всеми предложениями по умолчанию, а затем переопределить это действие для некоторых предложений, объявив другое действие в столбце SUGGEST_COLUMN_INTENT_ACTION . Если вы не включаете значение в столбец SUGGEST_COLUMN_INTENT_ACTION , используется намерение, указанное в атрибуте android:searchSuggestIntentAction .

Объявить данные о намерениях

Когда пользователь выбирает предложение, ваше действие с возможностью поиска получает намерение с определенным вами действием (как обсуждалось в предыдущем разделе), но намерение также должно содержать данные для вашего действия, чтобы определить, какое предложение выбрано. В частности, данные должны быть уникальными для каждого предложения, например идентификатор строки предложения в вашей таблице SQLite. Когда намерение получено, вы можете получить прикрепленные данные с помощью getData() или getDataString() .

Вы можете определить данные, включенные в намерение, двумя способами:

  • Определите данные для каждого предложения в столбце SUGGEST_COLUMN_INTENT_DATA таблицы предложений.

    Предоставьте всю необходимую информацию о данных для каждого намерения в таблице предложений, включив столбец SUGGEST_COLUMN_INTENT_DATA , а затем заполнив его уникальными данными для каждой строки. Данные из этого столбца прикрепляются к намерению точно так, как вы определяете их в этом столбце. Затем вы можете получить его с помощью getData() или getDataString() .

  • Разделите URI данных на две части: часть, общую для всех предложений, и часть, уникальную для каждого предложения. Поместите эти части в атрибут android:searchSuggestintentData конфигурации с возможностью поиска и столбец SUGGEST_COLUMN_INTENT_DATA_ID таблицы предложений соответственно.

    В следующем примере показано, как объявить часть URI, которая является общей для всех предложений в атрибуте android:searchSuggestIntentData вашей конфигурации с возможностью поиска:

      <?xml version="1.0" encoding="utf-8"?>
      <searchable xmlns:android="http://schemas.android.com/apk/res/android"
          android:label="@string/app_label"
          android:hint="@string/search_hint"
          android:searchSuggestAuthority="com.example.MyCustomSuggestionProvider"
          android:searchSuggestIntentAction="android.intent.action.VIEW"
          android:searchSuggestIntentData="content://com.example/datatable" >
      </searchable>
      

    Включите окончательный путь для каждого предложения (уникальную часть) в столбец SUGGEST_COLUMN_INTENT_DATA_ID таблицы предложений. Когда пользователь выбирает предложение, система берет строку из android:searchSuggestIntentData , добавляет косую черту ( / ), а затем добавляет соответствующее значение из столбца SUGGEST_COLUMN_INTENT_DATA_ID , чтобы сформировать полный URI контента. Затем вы можете получить Uri с помощью getData() .

Добавить больше данных

Если вам нужно выразить больше информации с вашим намерением, вы можете добавить еще один столбец таблицы, например SUGGEST_COLUMN_INTENT_EXTRA_DATA , который может хранить дополнительную информацию о предложении. Данные, сохраненные в этом столбце, помещаются в EXTRA_DATA_KEY дополнительного пакета намерения.

Управляйте намерением

После того как вы предоставите настраиваемые поисковые предложения с настраиваемыми намерениями, вам нужно, чтобы ваша активность поиска обрабатывала эти намерения, когда пользователь выбирает предложение. Это в дополнение к обработке намерения ACTION_SEARCH , которое уже выполняет ваша поисковая активность. Вот пример того, как вы можете обрабатывать намерения во время обратного вызова onCreate() вашей активности:

Котлин

when(intent.action) {
    Intent.ACTION_SEARCH -> {
        // Handle the normal search query case.
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            doSearch(query)
        }
    }
    Intent.ACTION_VIEW -> {
        // Handle a suggestions click, because the suggestions all use ACTION_VIEW.
        showResult(intent.data)
    }
}

Ява

Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
    // Handle the normal search query case.
    String query = intent.getStringExtra(SearchManager.QUERY);
    doSearch(query);
} else if (Intent.ACTION_VIEW.equals(intent.getAction())) {
    // Handle a suggestions click, because the suggestions all use ACTION_VIEW.
    Uri data = intent.getData();
    showResult(data);
}

В этом примере намеренное действие — ACTION_VIEW , а данные содержат полный URI, указывающий на предлагаемый элемент, синтезированный строкой android:searchSuggestIntentData и столбцом SUGGEST_COLUMN_INTENT_DATA_ID . Затем URI передается локальному методу showResult() , который запрашивает у поставщика контента элемент, указанный в URI.

Перепишите текст запроса

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

Переписать текст запроса можно следующими способами:

  • Добавьте атрибут android:searchMode в конфигурацию поиска со значением "queryRewriteFromText" . В этом случае содержимое столбца SUGGEST_COLUMN_TEXT_1 предложения используется для перезаписи текста запроса.
  • Добавьте атрибут android:searchMode в конфигурацию searchable\ со значением "queryRewriteFromData" . В этом случае содержимое столбца SUGGEST_COLUMN_INTENT_DATA предложения используется для перезаписи текста запроса. Используйте это только с URI или другими форматами данных, которые должны быть видны пользователю, например с URL-адресами HTTP. Не используйте внутренние схемы URI для переписывания запроса таким образом.
  • Укажите уникальную текстовую строку запроса в столбце SUGGEST_COLUMN_QUERY таблицы предложений. Если этот столбец присутствует и содержит значение для текущего предложения, он используется для перезаписи текста запроса и переопределения любой из предыдущих реализаций.

Отображение поисковых предложений в окне быстрого поиска

После того как вы настроите свое приложение для предоставления пользовательских поисковых предложений, сделать их доступными для глобально доступного окна быстрого поиска так же просто, как изменить конфигурацию поиска, включив в нее android:includeInGlobalSearch со значением "true" .

Единственный сценарий, в котором необходима дополнительная работа, — это когда поставщик контента требует разрешения на чтение. В этом случае вам необходимо добавить элемент <path-permission> , чтобы поставщик предоставил поставщику контента доступ на чтение к окну быстрого поиска, как показано в следующем примере:

<provider android:name="MySuggestionProvider"
          android:authorities="com.example.MyCustomSuggestionProvider"
          android:readPermission="com.example.provider.READ_MY_DATA"
          android:writePermission="com.example.provider.WRITE_MY_DATA">
  <path-permission android:pathPrefix="/search_suggest_query"
                   android:readPermission="android.permission.GLOBAL_SEARCH" />
</provider>

В этом примере поставщик ограничивает доступ к содержимому на чтение и запись. Элемент <path-permission> изменяет ограничение, предоставляя доступ для чтения к содержимому внутри префикса пути "/search_suggest_query" когда существует разрешение "android.permission.GLOBAL_SEARCH" . Это предоставит доступ к окну быстрого поиска, чтобы оно могло запросить у вашего поставщика контента предложения.

Если ваш поставщик контента не применяет разрешения на чтение, окно быстрого поиска считывает его по умолчанию.

Включить предложения на устройстве

По умолчанию приложения не могут предлагать предложения в окне быстрого поиска, даже если они настроены на это. Пользователь решает, включать ли предложения из вашего приложения в окно быстрого поиска, открыв элементы с возможностью поиска (расположенные в меню «Настройки» > «Поиск» ) и включив ваше приложение в качестве элемента с возможностью поиска.

Каждое приложение, доступное для окна быстрого поиска, имеет запись на странице настроек элементов, доступных для поиска . Запись включает название приложения и краткое описание того, какой контент доступен для поиска в приложении и доступен для предложений в окне быстрого поиска. Чтобы определить текст описания для вашего приложения с возможностью поиска, добавьте атрибут android:searchSettingsDescription в свою конфигурацию с возможностью поиска, как показано в следующем примере:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.MyCustomSuggestionProvider"
    android:searchSuggestIntentAction="android.intent.action.VIEW"
    android:includeInGlobalSearch="true"
    android:searchSettingsDescription="@string/search_description" >
</searchable>

Сделайте строку для android:searchSettingsDescription как можно более краткой и укажите содержимое, доступное для поиска. Например, «Исполнители, альбомы и треки» для музыкального приложения или «Сохраненные заметки» для приложения «Блокнот». Предоставление этого описания важно, чтобы пользователь знал, какие предложения ему предлагаются. Всегда включайте этот атрибут, если android:includeInGlobalSearch имеет значение true.

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

Управление ярлыками предложений в окне быстрого поиска

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

По умолчанию это включено для всех предложений, полученных с помощью окна быстрого поиска, но если данные ваших предложений со временем меняются, вы можете запросить обновление ярлыков. Например, если ваши предложения относятся к динамическим данным, таким как состояние присутствия контакта, запросите обновление ярлыков предложений при их отображении пользователю. Для этого добавьте SUGGEST_COLUMN_SHORTCUT_ID в таблицу предложений. Этот столбец можно использовать для настройки поведения ярлыков для каждого предложения одним из следующих способов:

  • Сделайте так, чтобы окно быстрого поиска повторно запросило у поставщика контента новую версию ярлыка предложения.

    Укажите значение в столбце SUGGEST_COLUMN_SHORTCUT_ID для повторного запроса новой версии при каждом отображении ярлыка. Ярлык быстро отображается с последними доступными данными до тех пор, пока не вернется запрос на обновление, после чего предложение обновляется новой информацией. Запрос на обновление отправляется вашему поставщику контента с URI-путем SUGGEST_URI_PATH_SHORTCUT вместо SUGGEST_URI_PATH_QUERY .

    Сделайте так, чтобы возвращаемый Cursor содержал одно предложение, используя те же столбцы, что и исходное предложение, или был пустым, указывая на то, что ярлык больше не действителен — в этом случае предложение исчезнет, ​​а ярлык будет удален.

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

  • Запретите копирование предложения в ярлык вообще.

    Укажите значение SUGGEST_NEVER_MAKE_SHORTCUT в столбце SUGGEST_COLUMN_SHORTCUT_ID . В этом случае предложение никогда не копируется в ярлык. Это необходимо только в том случае, если вы абсолютно не хотите, чтобы появилось ранее скопированное предложение. Если вы укажете обычное значение для столбца, то ярлык предложения будет отображаться только до тех пор, пока не вернется запрос на обновление.

  • Позвольте применить поведение ярлыка по умолчанию.

    Оставьте SUGGEST_COLUMN_SHORTCUT_ID пустым для каждого предложения, которое не изменяется и которое можно сохранить как ярлык.

Если ни одно из ваших предложений не изменилось, столбец SUGGEST_COLUMN_SHORTCUT_ID вам не нужен.

О рейтинге предложений окна быстрого поиска

После того как вы сделаете поисковые предложения вашего приложения доступными для окна быстрого поиска, рейтинг окна быстрого поиска будет определять, как предложения будут отображаться пользователю по конкретному запросу. Это может зависеть от того, сколько других приложений имеют результаты по этому запросу и как часто пользователь выбирает ваши результаты по сравнению с результатами других приложений. Нет никакой гарантии относительно того, как будут ранжироваться ваши предложения или будут ли вообще отображаться предложения вашего приложения по определенному запросу. В целом, предоставление качественных результатов увеличивает вероятность того, что предложения вашего приложения будут размещены на видном месте, а приложения, предоставляющие предложения низкого качества, с большей вероятностью будут иметь более низкий рейтинг или не будут отображаться.