4. Получение результата работы Activity
Важнейшей возможностью при открытии другого Activity является возможность получить результат работы этого Activity. Такая возможность часто бывает полезна при открытии Activity из своего же приложения, но наиболее часто это используется при открытии Activity другого приложения.
Например, вы можете открыть окно для получения снимка из камеры телефона, после чего получить результат работу этого окна в виде сделанной фотографии. Или, например, вы можете подключить к своему проекту стороннюю библиотеку, в которой определен уже готовый Activity, добавить его в манифест, вызвать и получить результат его работы.
Давайте рассмотрим пример с получением результатов работы окна.
Пример вызова другого Activity для получения результата
Создадим приложение с двумя Activity. Первое Activity вызывает второе, во втором пользователь вводит какие-то данные, которые передаются обратно в первое Activity. Макеты для двух окон выглядит следующим образом
1. Открытие Activity для получения результата
Для начала напишем обработчик нажатия для кнопки в первой Activity
Для того чтобы открыть Activity для получения результата используем метод контекста startActivityForResult()
. Первый параметр - явное намерение для открытия SecondActivity, второй параметр называется requestCode и является целым числом.
Назначение этого параметра очень простое – так как логика нашего приложения может быть очень сложной, то мы из одного окна можем теоретические открыть несколько других окон и получить из них результат
Как же нам потом узнать, из какого окна пришел результат? Для этого, при вызове метода startActivityForResult()
мы передаем не только намерение, но и целое число, код для окна, который он нам вернет обратно. Мы считаем этот код, поймем – из какого окна пришел результат и обработаем результат соответствующим образом.
2. Возврат результата из второго Activity
Теперь займемся кодом для SecondActivity. Наша задача состоит в том, чтобы считать введенное значение и передать его как результат работы Activity.
Таким образом, для того, чтобы вернуть результат работы Activity, мы создаем «пустой» Intent, то есть вызываем конструктор без параметров, не указывая контекст и адресата. В Intent мы помещаем наши данные, которые хотим вернуть, после чего вызываем метод setResult()
куда передаем наш сконструированный Intent.
Обратите внимание, что в качестве первого параметра метода setResult()
мы передаем некий result code (не путайте с request code!). Код результата позволяет нам сообщить в первый Activity – закончилась ли работа второго Activity успешно, или пользователь отменил операцию, и работа второго Activity была отменена.
Параметра Result Сode представляет собой обычную целочисленную константу. Изначально предусмотрены три стандартные константы:
RESULT_CANCELED (равно 0);
RESULT_OK (равно -1);
RESULT_FIRST_USER (равно 1) – обозначает первый «пользовательский» результат.
Помимо стандартных констант, вы можете использовать любое другое целое число.
Использовать собственные коды результата рекомендуется только тогда, когда уверены, что сторонние программы не будут вызывать ваш Activity. Если же вам необходимо использовать свои константы в любом случае, указывайте это в сопроводительной документации к вашему коду.
Для примера использования кода RESULT_CANCELED запрограммируем SecondActivity так, чтобы оно возвращало RESULT_CANCELED если пользователь нажал на устройстве кнопку «Назад». Для этого переопределим метод onBackPressed()
Обратите внимание, что в этом случае мы используем перегруженный метод setResult()
всего с одним параметром. Это обусловлено, что в этом случае мы не передаем никаких данных - важен сам факт отмены операции. В таком случае создавать Intent не нужно.
3. Обработка результата в первом Activity
Теперь вернемся в MainActivity и обработаем результат, который пришел из SecondActivity
Для того чтобы обработать результат, переопределим метод onActivityResult()
. Метод содержит три аргумента:
requestCode - код, который мы передавали при вызове метода
startActivityForResult()
;resultCode - код результата, который мы указывали в методе
setResult()
;Intent - намерение с данными (если мы вызывали метод
setResult()
без параметра Intent, то он будет равен null).
Сначала мы проверяем код, чтобы убедиться что результат пришел из SecondActivity, далее мы проверяем код результата и прописываем логику работы метода в зависимости от того, успешно ли закрылось SecondActivity. Далее мы делаем еще несколько проверок на наличие объекта Intent и на наличие данных внутри намерения.
Запускаем приложение, в первом случае вернемся с помощью кнопки "Назад", во втором случае укажем какой-то текст и нажмем кнопку для отсылки результата.
Last updated