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

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

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

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

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

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

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

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

Задается в фильтре с помощью элемента <action>. Значение, указанное в данном элементе должно являться полным строковым наименованием действия, а не константой, как это рассмотрено выше.
Данные
Описывает данные, ассоциированные с намерением.

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

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

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

Задается в фильтре с помощью элемента <category>

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

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

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

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

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

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

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

Управление намерениями в вашем явлении

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

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

Например:

Возвращение результата

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

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

Примечание: по умолчанию код результата равен RESULT_CANCELED. То есть, если пользователь нажмет кнопку назад прежде, чем операция будет закончена, оригинальное приложение получит код “отменен” в качестве результата.

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

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

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

Добавить комментарий