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

Предыдущие два урока сосредоточены на запуске activity другого приложения из вашего приложения. Но если ваше приложение может выполнять действия, которые могут быть полезны для других приложений, то ваше приложение должно быть готово ответить на запросы действий других приложений. Например, если вы построили социальное приложение, которое может поделиться сообщениями или фотографиями с друзьями пользователя, то в ваших интересах поддержать ACTION_SEND интент, так что пользователи смогут инициировать действие “поделиться” из другого приложения, и запустить ваше приложение для выполнения действия.

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

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

[wpanchor id=”1″]

 

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


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

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

action (действие)
Строка с название выполняемого действия. Обычно одно из значений определенных платформой, такое как ACTION_SEND или ACTION_VIEW.Укажите его в своем интент-фильтре с помощью <action> элемента. Указанное значение в этом элементе должна быть строка с полным именем действия, а не константы API (см. примеры ниже).
data (данные)
Описание данных, связанных с интентом. Укажите его в своем интент-фильтре с помощью <data> элемента. Используя один или несколько атрибутов в этом элементе, вы можете указать только MIME тип, только префикс URI, только схему URI, или сочетание этих и других элементов, которые описывают тип принимаемых данных.

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

category (категория)
Предоставляет дополнительный способ охарактеризовать activity , обрабатывающей интенты, как правило это связанно с жестом пользователя или местом, из которого оно запускается. Есть несколько различных категорий, поддерживаемых системой, но большинство из них используется редко. Тем не менее, все неявные интенты определяются с помощью CATEGORY_DEFAULT по умолчанию.Укажите его в своем интент-фильтре с помощью <category> элемента.

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

Например, вот activity с интент-фильтром , который обрабатывает 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>

 

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

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

Например, предположим, ваша activity обрабатывает текст и изображения для двухACTION_SEND и ACTION_SENDTO интент. В этом случае, необходимо определить два отдельных фильтра намерений для двух действий, потому что ACTION_SENDTO интент должен использовать данные Uri для указания адреса получателя с помощью send или sendto схемы URI. Например:

<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 . Если вы не объявите её в интент-фильтре , неявные намерения не попадут в вашу activity .

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

[wpanchor id=”2″]

 

Обработать интент в вашей activity


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

Когда ваша activity запустилась, вызовите getIntent() для получения Intent , который запустил activity . Вы можете сделать это в любое время в течение всего жизненного цикла деятельности, но как правило, это следует сделать это во время вызова ранних методов обратного вызова, таких как 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 ...
    }
}

 

[wpanchor id=”3″]

 

Вернуть результат


Если вы хотите вернуть результат в activity , которая вызвала вашу, просто вызовитеsetResult() для указания кода результата и результирующего Intent. Когда ваша операция завершилась, и пользователь должен вернуться в исходную activity , вызовите finish() для закрытия (и уничтожения) ваша activity . Например:

// 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 по умолчанию. Так что, если пользователь нажимает кнопку Назад до завершения действия, и, прежде чем вы установили результат, то вызывающая activity получает результат “отменен”.

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

setResult(RESULT_COLOR_RED);
finish();

 

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

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

Додати коментар