Получения результата выполнения явления

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

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

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

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

Запуск явления

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

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

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

Получение результата

Если пользователь закрыл стороннее явление и вернулся в ваше, система вызывает метод onActivityResult(). В метод передается три аргумента:

  • Код запроса, который вы указали при вызове startActivityForResult().
  • Код возврата явления. Это может быть или RESULT_OK, если операция завершена успешно, или RESULT_CANCELED, если пользователь просто вернулся или операция не была успешно завершена по каким-либо причинам.
  • Намерение, в котором содержится результат выполнения.

Например так можно получить результат выбора контакта:

В данном примере возвращенный объект намерения содержит Uri, указывающий на выбранный контакт.

Чтобы успешно обработать результат, вы должны знать формат результирующего намерения. Это совсем просто, если вы обрабатываете результат работы одного из ваших явлений. Для стандартных приложений Android есть документация по API, поэтому вы будете знать в каком формате вернется результат. К примеру, приложение Контакты всегда возвращает результат в виде Uri выбранного контакта, приложение Камера всегда возвращает объект Bitmap в качестве дополнительных данных (смотрите урок о съемке фото)

Бонус: Чтение контактов

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

Примечание: до Android 2.3 (API 9), обращение к поставщику контента Contacts (как показано выше), требовало указать право на чтение READ_CONTACTS (смотрите раздел Безопасность и разрешения). Однако, начиная с Android 2.3 приложения Контакты/Люди дают временные разрешения на чтение поставщика контактов при возвращении им результата. Временное разрешение выдается для конкретного запроса, вы не сможете запросить контакт, Uri которого отличается от полученного в намерении, если только в не получили разрешение READ_CONTACTS.

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