Запуск другого приложения

Одна из наиболее важных особенностей Android это возможность приложений перекидывать пользователя в другое приложение на основе “действий”, которые нужно совершить. Например, если ваше приложение хранит адрес дома, который вы хотите показать на карте, вам не нужно создавать явление для отображения карты. Вместо этого вы можете создать запрос другому приложению с помощью объекта намерения Intent. Система запустит приложение, способное отобразить здание с указанным адресом на карте.

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

В данном уроке мы покажем как создавать неявные намерения для выполнения конкретных действий, и как использовать их для запуска приложений, способных эти действия выполнять.

Создание неявного намерения

В неявных намерениях не указывается имя класса компонента, который должен быть запущен, вместо этого указывается действие, которое нужно выполнить. Действие указывает на вещи, которые вы хотите сделать, например просмотр, редактирование, отправка письма или что-то еще. Часто намерения включают в себя данные, ассоциированные с действием, вроде адреса, который вы хотите посмотреть на карте, или email сообщения для отправки. В зависимости от того, какое намерение вы хотите создать, данные будут различаться, а могут совсем отсутствовать.

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

Например так можно создать намерение, которое инициирует телефонный звонок, используя Uri данные для указания номера:

Если приложение выполняет намерение с помощью вызова метода startActivity(), звонилка начнет вызов на данный номер.

Ниже приведены несколько других намерений, задающих пары Uri и действий:

Просмотр карты

Просмотр web-страницы.

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

По умолчанию, система определяет соответствующие MIME типы для определенного намерения на основе переданных Uri. Если вы не включали Uri в намерение, вы должны вызывать метод setType(), чтобы ассоциировать намерение с нужным типом данных. Установка MIME типа уточняет, какие виды явлений должно получать намерение.

Ниже приведен пример намерений, которые требуют дополнительных данных для выполнения действий:

Отправка письма с вложением:

Создание события в календаре:

Примечание: данное намерение для календаря поддерживается только в API 14 и выше.


Примечание: важно, чтобы объявление намерений было как можно более конкретным. Например, если вы хотите показать картинку, используя намерение ACTION_VIEW, вы должны указать MIME тип image/*. Это отсеет приложения, которые могут “показать”, но другие типы данных, например карты.

Проверка наличия приложения для получения намерения

И хотя Android гарантирует, что некоторые намерения будут обработаны одним из приложений(например, звонилкой, календарем или email клиентом), вы всегда должны проверять их наличие перед вызовом намерения.

Внимание: если вы вызвали намерение, которое не может принять ни одно из приложений на устройстве, ваше приложение аварийно завершится.

Чтобы проверить существование явления, способного принять намерение, вызовите метод queryIntentActivities() для получения списка явлений, способных обрабатывать ваше намерение. Если метод вернет не пустой список (объект типа List), можете использовать ваше намерение. Например:

Если isIntentSafe равен true, по крайней мере одно приложение может принять намерение. Если переменная равна false, значит на устройстве нет таких приложений.

Примечание: вы можете выполнять проверку при первом старте вашего явления в случаях, если необходимо запретить некоторые функции, использующие намерение, прежде чем пользователь захочет ими воспользоваться. Если есть конкретное приложение, которое может обработать намерение, вы можете указать пользователю ссылку, по которой он может скачать данное приложение. (Смотрите Как создать ссылку на ваши программы в Google Play).

Запуск явлений с помощью намерений

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

пример окна выбора приложения

Рисунок 1. Пример диалогового окна для выбора приложения, которое будет обрабатывать намерение.

Пример создания намерения для отображения карты с проверкой существования приложений, способных его обработать:

Показ диалога выбора приложений

диалог выбора

Рисунок 2.Диалог выбора

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

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

Чтобы показать такой диалог, создайте намерение используя метод createChooser() и передайте его в метод startActivity(). Например:

Приведенный выше код позволяет показать диалог с заданным заголовком, содержащий список приложений, способных обработать намерение, переданный в метод createChooser().

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