Если ваше приложение может выполнять действие, которое может быть полезно для другого приложения, подготовьте его для ответа на запросы действий, указав соответствующий фильтр намерений в своей деятельности.
Например, если вы создаете социальное приложение, которое может делиться сообщениями или фотографиями с друзьями пользователя, поддержите намерение ACTION_SEND
. Затем, когда пользователи инициируют действие «поделиться» из другого приложения, ваше приложение появляется в качестве опции в диалоговом окне выбора (также известном как диалоговое окно устранения неоднозначности ), как показано на рисунке 1.
Чтобы другие приложения могли запускать вашу активность таким образом, вам необходимо добавить элемент <intent-filter>
в файл манифеста для соответствующего элемента <activity>
.
Когда ваше приложение устанавливается на устройство, система определяет ваши фильтры намерений и добавляет информацию во внутренний каталог намерений, поддерживаемый всеми установленными приложениями. Когда приложение вызывает startActivity()
или startActivityForResult()
с неявным намерением, система проверяет действия, которые могут ответить на это намерение.
Добавить фильтр намерений
Чтобы правильно определить, какие намерения может обрабатывать ваша активность, сделайте каждый добавляемый фильтр намерений как можно более конкретным с точки зрения типа действия и данных, которые принимает активность.
Система может отправить данное Intent
действию, если это действие имеет фильтр намерений, который соответствует следующим критериям объекта Intent
:
- Действие
- Строка с именем действия, которое необходимо выполнить. Обычно одно из значений, определенных платформой, например
ACTION_SEND
илиACTION_VIEW
.Укажите это в своем фильтре намерений с помощью элемента
<action>
. Значение, указанное вами в этом элементе, должно быть полным строковым именем действия, а не константой API, как показано в примерах на этой странице. - Данные
- Описание данных, связанных с намерением.
Укажите это в своем фильтре намерений с помощью элемента
<data>
. Используя один или несколько атрибутов в этом элементе, вы можете указать тип MIME, префикс URI, схему URI или комбинацию этих и других, которые указывают принятый тип данных.Примечание. Если вам не нужно объявлять подробности о
Uri
данных, например, когда ваша активность обрабатывает другие виды «дополнительных» данных, вместо URI укажите только атрибутandroid:mimeType
, чтобы объявить тип данных вашей активности. дескрипторы, такие какtext/plain
илиimage/jpeg
. - Категория
- Предоставляет дополнительный способ охарактеризовать действие, обрабатывающее намерение, обычно связанное с жестом пользователя или местоположением, из которого оно началось. Система поддерживает несколько различных категорий, но большинство из них используются редко. Однако все неявные намерения по умолчанию определяются с помощью
CATEGORY_DEFAULT
.Укажите это в своем фильтре намерений с помощью элемента
<category>
.
В фильтре намерений вы можете объявить, какие критерии принимает ваша деятельность, объявив каждый из них с соответствующими элементами XML, вложенными в элемент <intent-filter>
.
Например, вот действие с фильтром намерений, которое обрабатывает намерение ACTION_SEND
, когда тип данных — текст или изображение:
<activity android:name="ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
Совет: Если вы хотите, чтобы значок в диалоговом окне выбора отличался от значка по умолчанию для вашей активности, добавьте android:icon
в элемент <intent-filter>
.
Каждое входящее намерение определяет только одно действие и один тип данных, но можно объявить несколько экземпляров элементов <action>
, <category>
и <data>
в каждом <intent-filter>
.
Если какие-либо две пары действий и данных являются взаимоисключающими в своем поведении, создайте отдельные фильтры намерений, чтобы указать, какие действия приемлемы в сочетании с какими типами данных.
Например, предположим, что ваша активность обрабатывает как текст, так и изображения для целей ACTION_SEND
и ACTION_SENDTO
. В этом случае необходимо определить два отдельных фильтра намерений для двух действий, поскольку намерение ACTION_SENDTO
должно использовать Uri
данных для указания адреса получателя с использованием схемы URI send
или sendto
. Это показано в следующем примере:
<activity android:name="ShareActivity"> <!-- Filter for sending text; accepts SENDTO action with sms URI schemes --> <intent-filter> <action android:name="android.intent.action.SENDTO"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="sms" /> <data android:scheme="smsto" /> </intent-filter> <!-- Filter for sending text or images; accepts SEND action and text or image data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
Примечание. Чтобы получать неявные намерения, необходимо включить категорию CATEGORY_DEFAULT
в фильтр намерений. Методы startActivity()
и startActivityForResult()
обрабатывают все намерения так, как если бы они объявили категорию CATEGORY_DEFAULT
. Если вы не объявите это в своем фильтре намерений, никакие неявные намерения не будут соответствовать вашей активности.
Дополнительные сведения об отправке и получении намерений ACTION_SEND
, которые выполняют функции обмена в социальных сетях, см. в разделе Получение простых данных из других приложений . Вы также можете найти полезную информацию об обмене данными в разделах «Общий доступ к простым данным» и «Общий доступ к файлам» .
Управляйте намерением в своей деятельности
Чтобы решить, какое действие предпринять в вашей деятельности, прочитайте Intent
, которое используется для ее запуска.
Когда ваше действие начнется, вызовите getIntent()
, чтобы получить Intent
, которое запустило действие. Вы можете сделать это в любой момент жизненного цикла активности, но обычно вы делаете это во время ранних обратных вызовов, таких как onCreate()
или onStart()
.
Это показано в следующем примере:
Котлин
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) val data: Uri? = intent?.data // Figure out what to do based on the intent type if (intent?.type?.startsWith("image/") == true) { // Handle intents with image data } else if (intent?.type == "text/plain") { // Handle intents with text } }
Ява
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get the intent that started this activity Intent intent = getIntent(); Uri data = intent.getData(); // Figure out what to do based on the intent type if (intent.getType().indexOf("image/") != -1) { // Handle intents with image data } else if (intent.getType().equals("text/plain")) { // Handle intents with text } }
Вернуть результат
Если вы хотите вернуть результат действию, которое вызвало ваше, вызовите setResult()
чтобы указать код результата и Intent
результата. Когда ваша операция будет завершена и пользователь вернется к исходному действию, вызовите finish()
чтобы закрыть и уничтожить ваше действие. Это показано в следующем примере:
Котлин
// Create intent to deliver some kind of result data Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result -> setResult(Activity.RESULT_OK, result) } finish()
Ява
// Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); setResult(Activity.RESULT_OK, result); finish();
Вместе с результатом всегда необходимо указывать код результата. Обычно это либо RESULT_OK
, либо RESULT_CANCELED
. Затем при необходимости вы можете предоставить дополнительные данные с помощью Intent
.
Примечание. По умолчанию результат имеет значение RESULT_CANCELED
. Таким образом, если пользователь нажмет кнопку «Назад» до завершения действия и до того, как вы установите результат, исходное действие получит «отмененный» результат.
Если вам просто нужно вернуть целое число, указывающее один из нескольких вариантов результата, вы можете установить код результата на любое значение больше 0. Если вы используете код результата для доставки целого числа и вам не нужно включать Intent
, вы может вызвать setResult()
и передать только код результата:
Котлин
setResult(RESULT_COLOR_RED) finish()
Ява
setResult(RESULT_COLOR_RED); finish();
В этом случае возможных результатов может быть всего несколько, поэтому код результата представляет собой локально определенное целое число (больше 0). Это хорошо работает, когда вы возвращаете результат действию в своем собственном приложении, поскольку действие, которое получает результат, может ссылаться на общедоступную константу, чтобы определить значение кода результата.
Примечание. Нет необходимости проверять, было ли ваше действие запущено с помощью startActivity()
или startActivityForResult()
. Просто вызовите setResult()
, если намерение, с которого началось ваше действие, может ожидать результата. Если исходное действие называется startActivityForResult()
, система доставляет ему результат, который вы передаете в setResult()
; в противном случае результат игнорируется.