Android studio startactivityforresult устарел

Содержание
  1. Полный список
  2. Русские Блоги
  3. Глубоко понять ActivityResultContract — новый способ замены startActivityForResult
  4. как использовать
  5. Реализация, связанная с ActivityResultContract
  6. StartActivityForResult
  7. ActivityResultRegistry
  8. Реализация, связанная с ComponentActivity
  9. Вам все еще нужен requestCode?
  10. Реализация, связанная с фрагментом
  11. Интеллектуальная рекомендация
  12. Многослойная презентацияViewController Jap
  13. Распечатать список с конца до головы
  14. Типы данных и переменные
  15. Python Daily Practice (4) -идиомы заполняют музыку
  16. startActivityForResult не отображается как устаревшее в Android Studio
  17. 1 ответ
  18. StartActivityForResult is deprecatedВ !!
  19. #Introduction
  20. #Example 1: Activity A calls Activity B for the result
  21. #Example 2: Start external component like the camera to get the image:
  22. #Example 3: Fragment A calls Activity B for the result
  23. #Example 4: Receive the result in a non-Android class
  24. Получаем результат правильно (Часть 1). Activity Result API
  25. Чем плох onActivityResult()?
  26. Используем Activity Result API
  27. Шаг 1. Создание контракта
  28. Шаг 2. Регистрация контракта
  29. Шаг 3. Запуск контракта
  30. Важно!
  31. Работа с runtime permissions
  32. Подводим итоги

Полный список

— вызываем Activity с возвратом результата

Бывает необходимость вызвать Activity, выполнить на нем какое-либо действие и вернуться с результатом. Например – при создании SMS. Вы жмете кнопку «добавить адресата», система показывает экран со списком из адресной книги, вы выбираете нужного вам абонента и возвращаетесь в экран создания SMS. Т.е. вы вызвали экран выбора абонента, а он вернул вашему экрану результат.

Об этом можно почитать здесь.

Давайте посмотрим на практике. Создадим приложение с двумя экранами. С первого экрана будем вызывать второй экран, там вводить данные, нажимать кнопку и возвращаться на первый экран с введенными данными. Например, будем таким образом запрашивать имя.

Создадим проект:

Project name: P0291_SimpleActivityResult
Build Target: Android 2.3.3
Application name: SimpleActivityResult
Package name: ru.startandroid.develop.p0291simpleactivityresult
Create Activity: MainActivity

Открываем main.xml и нарисуем такой экран:

На экране TextView, который будет отображать имя, и кнопка, которая будет вызывать экран для ввода.

Определяем TextView и кнопку, настраиваем обработчик. В методе обработчика onClick создаем Intent, указываем класс второго Acivity (которое создадим чуть позже, на ошибку не обращайте внимания). Для отправки используем startActivityForResult. Отличие от обычного startActivity в том, что MainActivity становится «родителем» для NameActivity. И когда NameActivity закрывается, вызывается метод onActivityResult в MainActivity, тем самым давая нам знать, что закрылось Activity, которое мы вызывали методом startActivityForResult.

В startActivityForResult в качестве параметров мы передаем Intent и requestCode. requestCode – необходим для идентификации. В этом уроке мы его укажем, но не будем использовать по назначению. В следующем же уроке разберемся подробнее, зачем он нужен.

В onActivityResult мы видим следующие параметры:
requestCode – тот же идентификатор, что и в startActivityForResult. По нему определяем, с какого Activity пришел результат.
resultCode – код возврата. Определяет успешно прошел вызов или нет.
data – Intent, в котором возвращаются данные

requestCode и resultCode мы пока использовать не будем, подробнее рассмотрим их на следующем уроке. А из data мы будем получать объект по имени name и выводить значение в TextView.

Если мы извлекаем из Intent объект с именем name, значит надо, чтобы кто-то его туда положил. Этим займется NameActivity.

Создадим экран name.xml:

В поле ввода будем вводить имя и жать кнопку OK.

Создаем класс NameActivity и прописываем его в манифесте:

Определяем поле ввода и кнопку, прописываем обработчик. В методе onClick мы создаем Intent и помещаем в него данные из поля ввода под именем name. Обратите внимание, мы никак не адресуем этот Intent. Т.е. ни класс, ни action мы не указываем. И получается, что непонятно куда пойдет этот Intent. Но метод setResult знает, куда его адресовать — в «родительское» Activity, в котором был вызван метод startActivityForResult. Также в setResult мы передаем константу RESULT_OK, означающую успешное завершение вызова. И именно она передастся в параметр resultCode метода onActivityResult в MainActivity.java. Это мы подробнее разберем на следующем уроке. Далее методом finish мы завершаем работу NameActivity, чтобы результат ушел в MainActivity.

Все сохраним и запустим приложение.

Видим первый экран:

Жмем кнопку, чтобы попасть на экран ввода имени.

Вводим имя и жмем ОК

Снова первый экран, отобразивший полученные данные.

Попробуем подытожить. В MainActivity мы создали Intent с явным указанием на класс NameActivity. Запустили этот Intent с помощью метода startActivityForResult. NameActivity отобразилось, мы ввели имя и нажали кнопку. Создался Intent, в который поместилось введенное нами имя. Метод setResult знает, что Intent надо вернуть в Activity, которое выполнило вызов startActivityForResult, т.е. – MainActivity. В MainActivity за прием результатов с вызванных Activity отвечает метод onActivityResult. В нем мы распаковали Intent и отобразили полученные данные в TextView.

Читайте также:  Космические рейнджеры порт андроид

Пока необходимо просто понять схему вызова и возврата.

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

На следующем уроке:

— разбираемся, зачем нужны requestCode и resultCode в onActivityResult

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Русские Блоги

Глубоко понять ActivityResultContract — новый способ замены startActivityForResult

ActivityResultContract Это недавно добавленный API в Activity 1.2.0-alpha02 и Fragment 1.3.0-alpha02, с которым можно работать более удобно и безопасно. startActivityForResult 。

как использовать

AppCompatActivity и Fragment могут передавать prepareCall() Создайте launcher А потом позвони launch(intent) Перейти к startActivityForResult

Реализация, связанная с ActivityResultContract

StartActivityForResult

prepareCall() Входящий ActivityResultContracts.StartActivityForResult Экземпляр, наследуется от ActivityResultContract

Конечно, также можно заменить его анонимным классом, как показано ниже.

Ограничьте тип параметра startActivity и тип результата, возвращаемый onActivityResult, с помощью двух общих параметров ActivityResultContract

ActivityResultRegistry

prepareCall Позвоню ActivityResultRegistry.registerActivityResultCallback() метод

Конечно, Activity также может вызывать activityResultRegistry напрямую, без prepareCall, как показано ниже.

registerActivityResultCallback() Будет держать ActivityResultRegistory HashMap выполняет операцию ввода, запись ActivityResultContract

Реализация, связанная с ComponentActivity

Activity содержит ActivityResultRegistry, ActivityResultRegistry управляет ActivityResultContract и ActivityResultCallback через HashMap. Ключевая форма HashMap выглядит следующим образом:

Вам все еще нужен requestCode?

Раньше onActivityResult требовалось передать requestCode Чтобы определить, какой из startActivityForResult вернулся, теперь им можно управлять с помощью AutoIncrement. И когда процесс убит onSaveInstanceState Пара пары ключей requestCode и ActivityResultRegistry будет автоматически сохранена. Когда onActivityResult возвращает rc, ключ можно найти через соответствующее отношение, а затем можно будет найти ActivityResultCallback

Реализация, связанная с фрагментом

В реализации Fragment.prepareCall () getActivity (). GetActivityResultRegistry (). RegisterActivityResultCallback вызывается, когда ON_CREATE

Хотя registerActivityResultCallback вводит экземпляр Framgent в HashMap, хранимый вышестоящим, соответствующая постобработка будет выполняться при ON_DESTROY, поэтому нет необходимости беспокоиться об утечках памяти

Интеллектуальная рекомендация

Многослойная презентацияViewController Jap

. Недавно, проект использует многоэтажные прыжки [A presentViewController: B animated: YES] [B presentViewController: C animated: YES] . Проблема в том, где: как это идет прямо к? Я не нашел ме.

Распечатать список с конца до головы

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

Типы данных и переменные

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

Python Daily Practice (4) -идиомы заполняют музыку

оглавление 1. Одно место 2. Случайное расположение 3. Добавьте баллы для оценки 4. Получение файла 5. Установите уровень сложности. 6. Срок завершения 7. Выберите заполнение пропусков. 1. Одно место Н.

Источник

startActivityForResult не отображается как устаревшее в Android Studio

Некоторое время назад я работал над новым приложением и заметил, что startActivityForResult устарел, поэтому мне пришлось использовать ActivityResultLauncher

Сейчас я обновляю другое приложение, которое работает с startActivityForResult , но Android Studio не помечает метод как устаревший. Проведя небольшое исследование, я заметил, что minSdkVersion должен иметь самую последнюю версию API для Android Studio, чтобы показать, что он устарел. методы, поэтому теперь у меня есть compileSdkVersion 31 и minSdkVersion 31 , и я уже вижу много устаревших методов, которых не видел раньше, но startActivityForResult все еще не отмечен, даже если я использовал метод «Анализировать> Проверить код» и после строки «Java> Code maturity», но это не показывает мне, что я устарел, когда я использовал startActivityForResult

Поэтому мне нужна ваша помощь, чтобы узнать, почему он не отмечен как устаревший, и это также заставляет меня думать о следующем: существует ли вероятность того, что существуют более устаревшие методы, о которых я не знаю, и Android Studio не показывает их мне?

Читайте также:  Android studio arraylist получить значение по индексу

Я уточняю, что вчера я обновил Android Studio до последней версии (Android Studio Arctic Fox | 2020.3.1 Patch 3), думая, что это может быть проблемой, но мне это не удалось.

1 ответ

Однако startActivityForResult() на ComponentActivity не рекомендуется. ComponentActivity , грубо говоря, является корнем всех действий в библиотеках Jetpack. AppCompatActivity расширяет ComponentActivity .

Итак, я предполагаю, что:

В случае, если вы получаете предупреждение об устаревании, вы наследуете от ComponentActivity

В случае, если вы не получаете предупреждения об устаревании, вы не наследуете от ComponentActivity

Источник

StartActivityForResult is deprecatedВ !!

Updated: Nov 01, 2021 |

Published: Sep 14, 2021

#Introduction

Android has been on the edge of evolution for a while recently, with updates to androidx.activity:activity-ktx to 1.2.0 . It has deprecated startActivityForResult in favour of registerForActivityResult .

It was one of the first fundamentals that any Android developer has learned, and the backbone of Android’s way of communicating between two components. API design was simple enough to get started quickly but had its cons, like how it’s hard to find the caller in real-world applications (except for cmd+F in the project 😂), getting results on the fragment, results missed if the component is recreated, conflicts with the same request code, etc.

Let’s try to understand how to use the new API with a few examples.

#Example 1: Activity A calls Activity B for the result

As you would have noticed, registerForActivityResult takes two parameters. The first defines the type of action/interaction needed ( ActivityResultContracts ) and the second is a callback function where we receive the result.

Nothing much has changed, right? Let’s check another example.

#Example 2: Start external component like the camera to get the image:

The above snippet is the complete code getting a preview image from the camera. No need for permission request code, as this is taken care of automatically for us!

Another benefit of using the new API is that it forces developers to use the right contract. For example, with ActivityResultContracts.TakePicture() — which returns the full image — you need to pass a URI as a parameter to launch , which reduces the development time and chance of errors.

Other default contracts available can be found here.

#Example 3: Fragment A calls Activity B for the result

This has been another issue with the old system, with no clean implementation available, but the new API works consistently across activities and fragments. Therefore, we refer and add the snippet from example 1 to our fragments.

#Example 4: Receive the result in a non-Android class

With the new API, this is possible using ActivityResultRegistry directly.

Источник

Получаем результат правильно (Часть 1). Activity Result API

Каждый Android-разработчик сталкивался с необходимостью передать данные из одной Activity в другую. Эта тривиальная задача зачастую вынуждает нас писать не самый элегантный код.

Наконец, в 2020 году Google представила решение старой проблемы — Activity Result API. Это мощный инструмент для обмена данными между активностями и запроса runtime permissions.

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

Чем плох onActivityResult()?

Роберт Мартин в книге “Чистый код” отмечает важность переиспользования кода — принцип DRY или Don’t repeat yourself, а также призывает проектировать компактные функции, которые выполняют лишь единственную операцию.

Проблема onActivityResult() в том, что при его использовании соблюдение подобных рекомендаций становится практически невозможным. Убедимся в этом на примере простого экрана, который запрашивает доступ к камере, делает фото и открывает второй экран — SecondActivity . Пусть в SecondActivity мы передаём строку, а назад получаем целое значение.

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

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

Читайте также:  Герои 3 для андроид без кэша

Используем Activity Result API

Новый API доступен начиная с AndroidX Activity 1.2.0-alpha02 и Fragment 1.3.0-alpha02 , поэтому добавим актуальные версии соответствующих зависимостей в build.gradle:

Применение Activity Result состоит из трех шагов:

Шаг 1. Создание контракта

Контракт — это класс, реализующий интерфейс ActivityResultContract . Где I определяет тип входных данных, необходимых для запуска Activity, а O — тип возвращаемого результата.

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

При создании контракта мы обязаны реализовать два его метода:

createIntent() — принимает входные данные и создает интент, который будет в дальнейшем запущен вызовом launch()

parseResult() — отвечает за возврат результата, обработку resultCode и парсинг данных

Ещё один метод — getSynchronousResult() — можно переопределить в случае необходимости. Он позволяет сразу же, без запуска Activity, вернуть результат, например, если получены невалидные входные данные. Если подобное поведение не требуется, метод по умолчанию возвращает null .

Ниже представлен пример контракта, который принимает строку и запускает SecondActivity, ожидая от неё целое число:

Шаг 2. Регистрация контракта

Следующий этап — регистрация контракта в активности или фрагменте с помощью вызова registerForActivityResult() . В параметры необходимо передать ActivityResultContract и ActivityResultCallback . Коллбек сработает при получении результата.

Регистрация контракта не запускает новую Activity , а лишь возвращает специальный объект ActivityResultLauncher , который нам понадобится далее.

Шаг 3. Запуск контракта

Для запуска Activity остаётся вызвать launch() на объекте ActivityResultLauncher , который мы получили на предыдущем этапе.

Важно!

Отметим несколько неочевидных моментов, которые необходимо учитывать:

Регистрировать контракты можно в любой момент жизненного цикла активности или фрагмента, но вот запустить его до перехода в состояние CREATED нельзя. Общепринятый подход — регистрация контрактов как полей класса.

Не рекомендуется вызывать registerForActivityResult() внутри операторов if и when . Дело в том, что во время ожидания результата процесс приложения может быть уничтожен системой (например, при открытии камеры, которая требовательна к оперативной памяти). И если при восстановлении процесса мы не зарегистрируем контракт заново, результат будет утерян.

Если запустить неявный интент, а операционная система не сможет найти подходящую Activity, выбрасывается исключение ActivityNotFoundException: “No Activity found to handle Intent”. Чтобы избежать такой ситуации, необходимо перед вызовом launch() или в методе getSynchronousResult() выполнить проверку resolveActivity() c помощью PackageManager .

Работа с runtime permissions

Другим полезным применением Activity Result API является запрос разрешений. Теперь вместо вызовов checkSelfPermission() , requestPermissions() и onRequestPermissionsResult() , стало доступно лаконичное и удобное решение — контракты RequestPermission и RequestMultiplePermissions .

Первый служит для запроса одного разрешения, а второй — сразу нескольких. В колбеке RequestPermission возвращает true , если доступ получен, и false в противном случае. RequestMultiplePermissions вернёт Map , где ключ — это название запрошенного разрешения, а значение — результат запроса.

В реальной жизни запрос разрешений выглядит несколько сложнее. В гайдлайнах Google мы видим следующую диаграмму:

Зачастую разработчики забывают о следующих нюансах при работе с runtime permissions:

Если пользователь ранее уже отклонял наш запрос, рекомендуется дополнительно объяснить, зачем приложению понадобилось данное разрешение (пункт 5a)

При отклонении запроса на разрешение (пункт 8b), стоит не только ограничить функциональность приложения, но и учесть случай, если пользователь поставил галочку “Don’t ask again”

Обнаружить эти граничные ситуации можно при помощи вызова метода shouldShowRequestPermissionRationale() . Если он возвращает true перед запросом разрешения, то стоит рассказать пользователю, как приложение будет использовать разрешение. Если разрешение не выдано и shouldShowRequestPermissionRationale() возвращает false — была выбрана опция “Don’t ask again”, тогда стоит попросить пользователя зайти в настройки и предоставить разрешение вручную.

Реализуем запрос на доступ к камере согласно рассмотренной схеме:

Подводим итоги

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

Мы увидели недостатки обмена данными через onActivityResult(), узнали о преимуществах Activity Result API и научились использовать его на практике.

Новый API полностью стабилен, в то время как привычные onRequestPermissionsResult() , onActivityResult() и startActivityForResult() стали Deprecated. Самое время вносить изменения в свои проекты!

Демо-приложение с различными примерами использования Activty Result API, в том числе работу с runtime permissions, можно найти в моем Github репозитории.

Источник

Оцените статью