← Назад к вопросам

Как получить результат выполнения от следующей Activity?

1.0 Junior🔥 241 комментариев
#Android компоненты#Жизненный цикл и навигация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как получить результат от предыдущей Activity в Android?

В Android архитектуре, где каждое Activity является независимым компонентом, передача данных между ними — распространенная задача. Получение результата от предыдущей (или запущенной) Activity осуществляется через механизм startActivityForResult() (в традиционном API) или более современный Activity Result API (введенный в AndroidX). Рассмотрим оба подхода.

Традиционный метод: startActivityForResult() (для поддержки старых версий)

Этот подход использовался до внедрения Activity Result API и требует реализации обратного вызова onActivityResult().

Процесс состоит из трех шагов:

  1. Запуск Activity с ожиданием результата: Вместо обычного startActivity(), используйте startActivityForResult(), передавая Intent и уникальный requestCode.

    // В основной Activity
    const val REQUEST_CODE_EDIT_DATA = 1001
    
    fun openEditActivity() {
        val intent = Intent(this, EditActivity::class.java)
        startActivityForResult(intent, REQUEST_CODE_EDIT_DATA)
    }
    
  2. Установка результата в запущенной Activity: В целевой Activity (например, EditActivity), после завершения работы, вы должны явно установить результат с помощью setResult() и затем закрыть ее (finish()).

    // В EditActivity после сохранения данных
    fun saveAndReturn() {
        val resultIntent = Intent()
        resultIntent.putExtra("edited_text", "Новые данные")
        setResult(Activity.RESULT_OK, resultIntent)
        finish()
    }
    
    // Если пользователь отменил действие
    fun cancel() {
        setResult(Activity.RESULT_CANCELED)
        finish()
    }
    
  3. Обработка результата в исходной Activity: В основной Activity необходимо переопределить метод onActivityResult(), который будет вызван системой после закрытия целевой Activity. Здесь вы проверяете requestCode, resultCode и извлекаете данные из Intent.

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_CODE_EDIT_DATA) {
            if (resultCode == Activity.RESULT_OK) {
                val resultText = data?.getStringExtra("edited_text")
                // Используйте полученные данные, например, обновите TextView
                textView.text = resultText
            } else if (resultCode == Activity.RESULT_CANCELED) {
                // Обработка случая, когда пользователь отменил действие
                Toast.makeText(this, "Редактирование отменено", Toast.LENGTH_SHORT).show()
            }
        }
    }
    

Ключевые термины: startActivityForResult(), requestCode, setResult(), resultCode (RESULT_OK, RESULT_CANCELED), onActivityResult().

Современный метод: Activity Result API (рекомендуемый)

Новый API, доступный через библиотеки AndroidX (androidx.activity:activity-ktx), предлагает более декларативный, безопасный и тестируемый подход. Он избавляет от необходимости переопределять onActivityResult() и управлять requestCode.

Основные шаги:

  1. Регистрация контракта результата: В исходной Activity вы регистрируете контракт, который описывает, как запускать Activity и как обрабатывать ее результат. Самый распространенный контракт — ActivityResultContracts.StartActivityForResult().

    // В основной Activity (например, в onCreate или как поле класса)
    private val editResultLauncher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result ->
        // Здесь обрабатывается результат (аналог onActivityResult)
        if (result.resultCode == Activity.RESULT_OK) {
            val data = result.data
            val resultText = data?.getStringExtra("edited_text")
            textView.text = resultText
        }
    }
    
  2. Запуск Activity через launcher: Для открытия целевой Activity теперь используется не метод Activity, а запуск через созданный launcher.

    fun openEditActivityModern() {
        val intent = Intent(this, EditActivity::class.java)
        editResultLauncher.launch(intent)
    }
    
  3. Установка результата в целевой Activity остается абсолютно такой же, как в традиционном подходе (используем setResult() и finish()).

Преимущества Activity Result API:

  • Чистая архитектура: Отделяет логику запуска от логики обработки результата.
  • Избавление от requestCode: Нет необходимости отслеживать уникальные коды.
  • Лучшая поддержка жизненного цикла: Launcher безопасно работает даже при изменениях состояния Activity (воссоздание).
  • Другие контракты: API предоставляет готовые контракты для получения разрешений (RequestPermission), взятия фото (TakePicture) и т.д.

Краткий вывод

  • Для современных приложений (использующих AndroidX) настоятельно рекомендуется применять Activity Result API (registerForActivityResult). Он является стандартом в текущей разработке.
  • Метод startActivityForResult() может быть необходим только для поддержки очень старых проектов или крайне специфических случаев.

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

Как получить результат выполнения от следующей Activity? | PrepBro