Как мы знаем, передача данных и получение ответов между двумя действиями - это самое распространенное, что мы делаем на этапе разработки уже давно. В настоящее время единственный способ получить ответы от следующего действия - это передать 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
контракты.
Заключение
Новый API результатов деятельности предлагает более простой способ выполнять множество стандартных задач, особенно requestPermission
, takePicture
и takePhoto
, поэтому нам больше не нужно полагаться на какие-либо сторонние библиотеки. Кроме того, он также упрощает старую реализацию, что может ослабить связь кода, улучшить возможность повторного использования и упростить тестирование.
Если у вас есть предложения или отзывы, я буду очень рад их услышать.
Хорошего дня! 😎