Назад к вопросам
Junior
66
questionbank

Как осуществляется навигация между Activity в Android?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Навигация между Activity осуществляется с помощью Intent.

Intent — это объект обмена сообщениями, который позволяет компонентам (таким как Activity, Services, Broadcast Receivers) запрашивать действия друг у друга.

Существует два основных типа Intent:

  • Явные Intent: Указывают конкретный компонент для запуска (например, класс Activity).
  • Неявные Intent: Указывают тип действия, которое нужно выполнить (например, посмотреть веб-страницу), и система Android выбирает подходящий компонент для его выполнения.

Для запуска новой Activity с помощью явного Intent используется метод startActivity().

// В текущей Activity
val intent = Intent(this, TargetActivity::class.java) // Явный Intent
startActivity(intent)

Для передачи данных между Activity можно использовать метод putExtra() объекта Intent:

// Отправка данных
val intent = Intent(this, TargetActivity::class.java)
intent.putExtra("key_name", "some_value")
startActivity(intent)

// Прием данных в TargetActivity (в методе onCreate() или onNewIntent())
val data = intent.getStringExtra("key_name")

Для получения результата из запущенной Activity, а не просто запуска новой, используется startActivityForResult(). После завершения дочерней Activity она может отправить результат обратно с помощью setResult() и finish(). Родительская Activity получает этот результат в методе onActivityResult().

// В родительской Activity
val intent = Intent(this, ChildActivity::class.java)
startActivityForResult(intent, REQUEST_CODE) // REQUEST_CODE - уникальный идентификатор

// Получение результата в родительской Activity
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        val resultData = data?.getStringExtra("result_key")
        // Обработка результата
    }
}

// В дочерней Activity (перед закрытием)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Начиная с AndroidX, рекомендуется использовать Activity Results API вместо startActivityForResult()/onActivityResult():

// В родительской Activity
private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data
        // Обработка результата
    }
}

// Запуск Activity
val intent = Intent(this, ChildActivity::class.java)
startForResult.launch(intent)

// В дочерней Activity (перед закрытием)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Также для более сложной навигации в современных Android-приложениях часто используется компонента Navigation из Jetpack:

  • Navigation Component: Позволяет определить навигационный граф, описывающий все возможные пути между экранами приложения. Использует NavController для управления перемещением по графу.
<!-- Пример nav_graph.xml -->
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/mobile_navigation"
    app:startDestination="@+id/firstFragment">

    <fragment
        android:id="@+id/firstFragment"
        android:name="com.example.app.FirstFragment"
        android:label="First" >
        <action
            android:id="@+id/action_firstFragment_to_secondFragment"
            app:destination="@id/secondFragment" />
    </fragment>
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.app.SecondFragment"
        android:label="Second" />
</navigation>
// В Activity (например, в Fragment)
findNavController().navigate(R.id.action_firstFragment_to_secondFragment)

Navigation Component упрощает реализацию навигации, включая передачу аргументов, поддержку диалоговых окон и управление back stack.