Как мы знаем, передача данных и получение ответов между двумя действиями - это самое распространенное, что мы делаем на этапе разработки уже давно. В настоящее время единственный способ получить ответы от следующего действия - это передать Intent и requestCode через startActivityForResult. После этого мы должны проверить код запроса и результата, прежде чем анализировать ответы на onActivityResult. Это может выглядеть так:

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

Давайте попробуем API результатов активности

Я до сих пор не уверен, изменится ли он снова в будущем, поскольку Activity Results API все еще находится на стадии альфа-тестирования, но я считаю, что если что-то изменится, это не будет большим изменением. Попробуем реализовать!

Во-первых, не забудьте добавить это в свою зависимость Gradle.

Во-вторых, создайте свой результирующий контракт, расширив абстрактный класс с именем ActivityResultContract<I,O>. I означает тип ввода, а O означает тип вывода. И тогда вам нужно всего лишь переопределить 2 метода.

И, наконец, последний шаг - это регистрация контракта на Activity. Вам необходимо передать свой индивидуальный контракт и обратный вызов в registerForActivityResult.

Вуаля! вы сделали. Как вы видите в приведенном выше коде, вложенного if больше не будет, и вы можете удалить всю константу кода запроса, потому что она будет поддерживаться классом ComponentActivity.

Но подождите, это еще не все! Готовые контракты на спасение

Удивительно, но Google предоставляет готовый контракт для часто используемых задач, таких как:

StartActivityForResult()
RequestMultiplePermissions()
RequestPermission()
TakePicturePreview()
TakePicture()
TakeVideo()
PickContact()
CreateDocument()
OpenDocumentTree()
OpenMultipleDocuments()
OpenDocument()
GetMultipleContents()
GetContent()

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

И последнее, но не менее важное: запросить разрешение будет проще, чем раньше. В прошлый раз я создал еще один класс только для обработки нескольких разрешений, но теперь они предоставляют RequestPermission и RequestMultiplePermission контракты.



andrewjapar / activityresultssample
Пример кода, демонстрирующего API результатов активности на GitHub. github.com



Заключение

Новый API результатов деятельности предлагает более простой способ выполнять множество стандартных задач, особенно requestPermission, takePicture и takePhoto, поэтому нам больше не нужно полагаться на какие-либо сторонние библиотеки. Кроме того, он также упрощает старую реализацию, что может ослабить связь кода, улучшить возможность повторного использования и упростить тестирование.

Если у вас есть предложения или отзывы, я буду очень рад их услышать.

Хорошего дня! 😎