Рубрики
Без рубрики

Глубокое погружение в API Результатов активности — Больше никаких onActivityResult()

Первоначально опубликовано на wajahatkarim.com (https://wajahatkarim.com/2020/05/activity-results-api-onactivityresult/) С тех пор как Android появился в 2007 году, активность была одним из его основных компонентов…

Автор оригинала: Wajahat Karim.

Первоначально опубликовано по адресу wajahatkarim.com

С тех пор как Android появился в 2007 году, Активность была одним из его основных компонентов. Одной из наиболее распространенных задач в приложениях является передача данных между двумя видами деятельности. До сих пор, Намерения и onActivityResult были единственным выбором.

Благодаря сочетанию этих двух частей разработчики могут передавать данные из одной Деятельности в другую и легко получать данные обратно.

Давайте рассмотрим пример: ваше приложение хочет захватить изображение и отобразить его пользователю. Вы либо пишете свою собственную пользовательскую камеру, либо делегируете задачу получения изображения Android через Намерения . В этом втором сценарии система Android откроет предпочитаемое пользователем приложение камеры, сделает снимок и передаст запрошенные данные для вашей активности, вызвав метод onActivityResult () .

Я работаю над видеоуроком этой статьи и загружу его на мой канал на YouTube скоро. Пожалуйста, подпишитесь, чтобы посмотреть это и другие учебные пособия для Android, подобные этому.

Подпишитесь на Мой канал на YouTube

Независимо от того, является ли это изображение Растровое изображение из приложения камеры или изображение из галереи, или, возможно, это какой-то пользовательский результат вашей какой-либо другой активности приложения, система Android вызовет onActivityResult() метод в исходном запросе Активность или Фрагмент класс.

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

У меня такое чувство, что вам вообще не нравится такой код для чтения/записи. Я тоже этого не делаю, потому что такой код приносит много проблем и нежелательных ошибок, таких как:

  • Тесная связь: Нет другого места, где вы могли бы поместить или абстрагировать этот код и бизнес-логику. Например, если вы хотите разделить каждый случай захвата изображения или выбрать изображение и т. Д. Ты не можешь этого сделать. Вы можете делегировать полномочия позже, но отправная точка такова. И это создаст плохой кластер, подобный приведенному выше коду, с вложенными блоками if-else.

  • Безопасность типов: Вы можете получить неверный тип данных из-за незначительных ошибок. Вы можете получить целочисленное значение в виде строки, а затем потратить часы на отладку причин, по которым приложения работают не так, как должны. Это связано с тем, что вы полагаетесь на строковые ключи для ввода/чтения данных о намерениях. Вам нужно будет убедиться, что вы используете правильный тип для правильного ключа.

  • Нежелательное исключение NullPointerException: Кого не раздражает Исключение NullPointerException ? Если вы получите опечатку при написании ключа для ввода или извлечения данных в Интернет , вы получите исключение NullPointerException , подобное сбою при взрыве в вашем приложении. Это может отнять много времени, так как вы можете отлаживать, почему ваши данные являются пустыми. Как вы должны думать, что в это время вы можете по ошибке пропустить какую-то букву в своем ключе?

Итак, Google предлагает нам решение, которое является более чистым в удобочитаемости кода с небольшим количеством блоков “если-то”, меньшим количеством связей и отдельными местами для каждого случая, безопасностью ввода, чтобы убедиться, что правильные данные попадают в правильный метод, и абсолютно без NullPointerException из-за опечаток.

Я не уверен, как это будет называться — API результатов деятельности или Контракты на результаты деятельности, или и то, и другое. Но, конечно, это звучит мило.

Начиная с Действия 1.2.0-alpha02 и Фрагмент 1.3.0-alpha02 , теперь у вас есть хорошая абстракция, которая позволяет вам обрабатывать Метод onActivityResult() в очень чистой и многоразовой структуре.

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

Во-первых, вам необходимо добавить следующие зависимости в файл build.gradle вашего приложения.

Пожалуйста, обратите внимание, что на момент написания этой статьи последняя версия Пожалуйста, обратите внимание, что на момент написания этой статьи последняя версия для активность-ktx и и для фрагмент-ktx . Вы можете проверить последнюю версию по ссылке Google Mavenlink. Эти API еще находятся на стадии альфа, поэтому API еще не является окончательным. Они могут быть изменены в любое время. Статья работает с alpha04 версия, но может работать или не работать с более ранними или более поздними версиями.

Процесс использования этого нового API выглядит следующим образом.

Процесс API результатов деятельности

1. Создать контракт

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

Вот пример Простого контракта , который принимает целое число в качестве входных данных и возвращает некоторые строковые данные из дочернего действия.

Метод createIntent() используется для создания действительного Намерения , которое будет передано в метод startActivityForResult() после вызова этого контракта. И метод parse Result() будет вести себя как прокси для метода onActivityResult() и анализирует результат Намерение и извлечение из него данных.

Вы можете видеть, что нам больше не нужно помещать кучу блоков if-else в метод onActivityResult () . Потому что каждый случай будет обрабатываться таким образом в отдельной реализации и отдельном методе ParseResult () . В этом заключается красота и простота API результатов деятельности.

2. Зарегистрировать Договор

Следующий шаг-зарегистрировать этот Простой контракт в API результатов деятельности. Это делается с помощью вызова метода register Для результата действия () .

Пожалуйста, обратите внимание, что в предыдущих версиях alpha02 и alpha03 , этот метод был вызван как prepareCall() . Но в alpha04 это было переименовано в регистрация Результата действия() .

Вы можете увидеть, как легко зарегистрировать свой контракт. И благодаря простоте любимого Котлина вы получите результат в виде приятного лямбда-метода. Это будет вызвано после метода parse Result() из контракта и выдаст вам результат (в нашем случае строку, допускающую обнуление). Вы можете проверить значение NULL, чтобы узнать, отменил ли пользователь действие или результат был RESULT_OK от детской активности.

3. Контракт на вызов

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

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

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

Захват изображений — ActivityResultКонтракты. Сделайте снимок()

Вы можете легко снимать изображения с камеры без каких-либо проблем с медиа-намерениями.

Выберите изображения — ActivityResultКонтракты. getContent

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

Теперь это мой самый любимый. Я помню, что мне пришлось написать около 100 строк кода, чтобы запросить несколько разрешений для обработки очень сложного потока. Я подробно писал об этом в этой статье когда еще не было API результатов активности.

API результатов действий предоставляет два метода — Запрос/| и Запрашивать несколько разрешений . Эти двое делают именно то, что их зовут. Вот краткий пример кода.

Я создал простой демонстрационный проект с некоторыми примерами контрактов, как описано в этой статье в следующем репозитории Github. Вы можете исследовать больше и играть с ним.

Подводя итог, в этой статье мы обсудили некоторые проблемы в традиционном onActivityResult() способе. А потом мы узнали о новом API результатов деятельности. Затем мы создали пример контракта, чтобы увидеть, как разные части работают вместе. И, наконец, мы увидели некоторые готовые контракты, такие как захват изображений, выбор изображений, обработка разрешений и т. Д.

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

Спасибо Роберто Оргиу за просмотр и предоставление отзывов об этом посте 🙌

Ваджахат Карим выпускник НИТУ, Исламабад , опытный разработчик мобильных устройств, активный участник с открытым исходным кодом и соавтор двух книг Изучение намерений Android и Освоение разработки игр для Android с помощью Unity . В свободное время он любит проводить время со своей семьей, экспериментировать с кодированием, любит писать о многих вещах (в основном в блоге и на медиафайле) и является страстным автором открытого исходного кода. В июне 2018 года одна из его библиотек стала № 1 на Github Тенденция . Его библиотеки имеют около 2000 звезд на Github и используются разработчиками в различных приложениях по всему миру. Следуйте за ним дальше Твиттер и Medium чтобы получать больше обновлений о его работе в письменной форме, Android и с открытым исходным кодом.

Кроме того, если у вас есть какие-либо вопросы, на которые вы хотели бы, чтобы он ответил, свяжитесь с ним через его веб-сайт по адресу wajahatkarim.com с УВАЖАЕМЫМ ВАДЖАХАТОМ в теме письма.

Оригинал: “https://www.codementor.io/@wajahatkarim/deep-dive-into-activity-results-api-no-more-onactivityresult-173ipxpd57”