Позвольте другим приложениям начать вашу деятельность

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

Например, если вы разрабатываете социальное приложение, позволяющее обмениваться сообщениями или фотографиями с друзьями пользователя, поддержите интент ACTION_SEND . Тогда, когда пользователи инициируют действие «поделиться» из другого приложения, ваше приложение появится в качестве варианта в диалоговом окне выбора (также известном как диалоговое окно разрешения неоднозначностей ), как показано на рисунке 1.

Рисунок 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
    }
}

Java

@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()

Java

// 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()

Java

setResult(RESULT_COLOR_RED);
finish();

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

Примечание: Нет необходимости проверять, был ли ваш Activity запущен с помощью startActivity() или startActivityForResult() . Просто вызовите setResult() если Intent, запустивший ваш Activity, ожидает результата. Если исходный Activity вызвал startActivityForResult() , то система передаст ему результат, который вы указали в setResult() ; в противном случае результат будет проигнорирован.