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

С помощью чего открывается экран в Android приложении

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

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

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

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

Открытие экранов (Activity) в Android

В Android для открытия нового экрана (который технически представлен Activity) используется механизм Intent (Намерение). Это фундаментальная концепция, которая позволяет не только запускать Activity внутри вашего приложения, но и взаимодействовать с компонентами других приложений и самой системы.

Основной механизм: Explicit и Implicit Intents

Существует два основных типа Intent для запуска Activity:

  1. Explicit Intent (Явное намерение): Используется для запуска конкретной, известной вам Activity внутри вашего же приложения. Вы прямо указываете класс целевой Activity.

    // Kotlin пример
    val intent = Intent(this, SecondActivity::class.java)
    startActivity(intent)
    
    // Java пример
    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
    startActivity(intent);
    
  2. Implicit Intent (Неявное намерение): Используется, когда вам нужно выполнить действие, но вы не знаете (или вам не важно), какое конкретное приложение или Activity его выполнит. Система Android находит подходящий компонент на основе объявленных им Intent Filters в AndroidManifest.xml. Это основа межприложенного взаимодействия.

    // Открытие веб-страницы (запустит браузер)
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://google.com"))
    startActivity(intent)
    
    // Отправка email
    val emailIntent = Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:")
        putExtra(Intent.EXTRA_EMAIL, arrayOf("test@example.com"))
        putExtra(Intent.EXTRA_SUBJECT, "Тема письма")
    }
    if (emailIntent.resolveActivity(packageManager) != null) {
        startActivity(emailIntent)
    }
    

Ключевые методы и дополнительные возможности

  • startActivity(intent) — базовый метод для запуска Activity.

  • startActivityForResult(intent, requestCode) (и его современный аналог Activity Result API) — используется, когда вам нужно не просто открыть экран, но и получить от него обратно какой-либо результат (например, выбор контакта или фото). Сейчас рекомендуется использовать Activity Result API через registerForActivityResult.

    // Современный подход с Activity Result API (Kotlin)
    val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            val data: Intent? = result.data
            // Обрабатываем данные, пришедшие из запущенной Activity
        }
    }
    
    // Где-то в коде для запуска:
    val intent = Intent(this, SelectionActivity::class.java)
    startForResult.launch(intent)
    
  • Флаги (Flags) и дополнительные данные (Extras):

    *   **Extras** (через `putExtra()`) — позволяют передать данные в запускаемую Activity (строки, числа, объекты, реализующие `Parcelable` или `Serializable`).
    *   **Flags** (через `addFlags()` или `setFlags()`) — изменяют поведение запуска Activity (например, `Intent.FLAG_ACTIVITY_CLEAR_TOP`, `Intent.FLAG_ACTIVITY_NEW_TASK`). Они критически важны для управления стеком навигации (back stack).

Регистрация Activity и Intent Filters

Любая Activity, которую вы хотите открыть, должна быть задекларирована в файле AndroidManifest.xml. Для Activity, запускаемой извне (через Implicit Intent), необходимо также объявить <intent-filter>.

<activity
    android:name=".MainActivity"
    android:exported="true"> <!-- exported=true позволяет запускать из других приложений -->
    <intent-filter>
        <!-- Это Activity будет предлагаться как главный запускаемый экран -->
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".SecondActivity"
    android:exported="false" /> <!-- Доступна только внутри приложения -->

<activity
    android:name=".ShareActivity"
    android:exported="true">
    <intent-filter>
        <!-- Эта Activity сможет обрабатывать ACTION_SEND для типа text/plain -->
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

Современные архитектурные подходы

В современных приложениях с архитектурой MVVM или MVI прямое создание Intent и вызов startActivity() во ViewModel считается антипаттерном, так как ViewModel не должна иметь ссылок на Android-контекст. Вместо этого используются:

  1. Собыдия (Events) или LiveData/StateFlow из ViewModel: ViewModel генерирует событие (например, navigationEvent), которое наблюдает Activity или Fragment.

  2. Навигационные компоненты (Navigation Component): Библиотека Android Jetpack, которая предоставляет более декларативный и безопасный способ навигации через граф навигации (nav_graph.xml). Запуск экрана в этом случае выглядит как вызов метода navigate() с ID направления или действия.

    // С использованием Navigation Component
    findNavController().navigate(R.id.action_mainFragment_to_detailFragment)
    

Итог: Базовым и обязательным инструментом для открытия экрана (Activity) является Intent, запускаемый методом startActivity(). Однако в реальной разработке этот механизм часто абстрагируется с помощью паттернов управления навигацией (Single Live Event, SharedFlow) или специализированных библиотек, таких как Navigation Component, что делает код более тестируемым, безопасным и удобным для управления сложной навигацией в приложении.