Skip to content

Most visited

Recently visited

navigation

Разрешение другим приложениям на запуск вашей операции

Предыдущие два урока были посвящены одной теме – запуску операции вашего приложения в другом приложении. Однако если ваше приложение может выполнять операции, полезные другим приложениям, его нужно подготовить так, чтобы оно реагировало на запросы других приложений. Представьте, что вы разработали приложение для социальных сетей, позволяющее отправлять сообщения и фотографии друзьям пользователя. В этом случае в ваших интересах будет поддерживать объекты Intent (намерения) ACTION_SEND, чтобы пользователи могли поделиться контентом из другого приложения и запускать ваше приложение для выполнения требуемого действия.

Чтобы разрешить другим приложениям запускать ваши операции, вам нужно добавить в ваш файл манифеста элемент <intent-filter> для соответствующего элемента <activity>.

Если ваше приложение установлено на устройстве, система идентифицирует ваши фильтры Intent и добавляет информацию во внутренний каталог намерений, поддерживаемый всеми установленными приложениями. Когда приложение осуществляет вызов startActivity() или startActivityForResult() с неявными объектами Intent, система определяет, какая операция (или какие операции) может отреагировать на объект Intent.

Добавление фильтра Intent

Чтобы правильно определить, какие объекты Intent может обрабатывать ваша операция, каждый добавляемый вами фильтр Intent должен быть максимально определенным с точки зрения действий и данных, принимаемых операцией.

Система может отправить указанный Intent в операцию, если у нее имеется фильтр Intent, соответствующий следующим критериям объекта Intent:

Действие
Строка, называющая действие, которое необходимо выполнить. Обычно это одно из определяемых платформой значений, например, ACTION_SEND или ACTION_VIEW.

Это следует указать в фильтре Intent с элементом <action>. Указанное в этом элементе значение должно представлять собой полное имя строки действия, а не постоянное значение API-интерфейса (см. примеры ниже).

Данные
Описание данных, связанных с объектом Intent.

Указывается в фильтре Intent с элементом <data>. Используя один или несколько атрибутов в этом элементе, вы можете указать только тип MIME, только префикс URI, только схему URI или из сочетание, а также другие индикаторы типа принимаемых данных.

Примечание. Если вам не нужно декларировать специфику данных Uri(например, когда операция использует другие виды дополнительных данных вместо URI), вы должны указать только атрибут android:mimeType для декларирования типа данных, с которыми работает ваша операция, например, text/plain или image/jpeg.

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

Это указывается в фильтре Intent с элементом <category> .

В своем фильтре Intent вы можете декларировать критерии, принимаемые вашей операцией. Для этого нужно декларировать каждый из них с соответствующими элементами XML, вложенными в элемент <intent-filter> .

Рассмотрим в качестве примера операцию с фильтром Intent, обрабатывающим объект 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>

Каждый входящий объект Intent указывает только одно действие и только один тип данных, однако допускается декларирование нескольких экземпляров элементов <action>, <category> и <data> в каждом <intent-filter>.

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

Допустим, ваша операция обрабатывает текст и изображения для объектов Intent ACTION_SEND и ACTION_SENDTO. В этом случае вам необходимо определить два отдельных фильтра Intent для двух действий, потому что объект Intent 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>

Примечание. Для получения неявных объектов Intent необходимо включить категорию CATEGORY_DEFAULT в фильтр Intent. Методы startActivity() и startActivityForResult() обрабатывают все объекты Intent, как если бы они декларировали категорию CATEGORY_DEFAULT. Если вы не декларируете ее в своем фильтре Intent, никакие неявные объекты Intent не будут разрешаться в вашу операцию.

Более подробную информацию об отправке и получении объектов ACTION_SEND Intent для социальных сетей и обмена данными см. в уроке Получение простых данных от других приложений.

Обработка объекта Intent в операции

Чтобы решить, какое действие выполнить в операции, можно прочитать объект Intent, использованный для ее запуска.

При запуске операции нужно вызвать getIntent() для получения Intent, запустившего операцию. Это можно сделать в любое время в течение жизненного цикла операции, но обычно это делается при ранних обратных вызовах, например, onCreate() или onStart().

Например:

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

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

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

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Следите за новостями от Google Developers в WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)