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

Как определить Intent?

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

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

Как определить Intent в Android

Intent — это объект для запуска компонентов Android (Activity, Service, BroadcastReceiver) и передачи данных между ними. Intent — это "интенция" приложения выполнить какое-то действие.

Определение Intent

Intent описывает:

  • Какой компонент запустить (явный Intent)
  • Какое действие выполнить (неявный Intent)
  • Какие данные передать
  • Какие дополнительные параметры нужны

Явные Intents (Explicit)

Явно указываем какой компонент запустить:

// Запуск другой Activity в том же приложении
val intent = Intent(this, UserDetailActivity::class.java)
intent.putExtra("userId", 123)
startActivity(intent)

// Или короче
val intent = Intent(this, UserDetailActivity::class.java).apply {
    putExtra("userId", 123)
    putExtra("userName", "Иван")
}
startActivity(intent)

Когда использовать:

  • Запуск собственных Activity/Service
  • Известен точный компонент
  • Внутри приложения

Неявные Intents (Implicit)

Указываем действие (action), Android сам найдёт компонент:

// Открыть URL в браузере
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://google.com"))
startActivity(intent)

// Отправить email
val intent = Intent(Intent.ACTION_SEND).apply {
    type = "message/rfc822"  // MIME-тип email
    putExtra(Intent.EXTRA_EMAIL, arrayOf("test@example.com"))
    putExtra(Intent.EXTRA_SUBJECT, "Тема")
    putExtra(Intent.EXTRA_TEXT, "Тело письма")
}
startActivity(Intent.createChooser(intent, "Отправить email"))

// Поделиться текстом
val intent = Intent(Intent.ACTION_SEND).apply {
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, "Проверь это!")
}
startActivity(Intent.createChooser(intent, "Поделиться"))

// Позвонить
val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:+7-999-123-45-67"))
startActivity(intent)

// Открыть камеру
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, CAMERA_REQUEST_CODE)

Когда использовать:

  • Открыть браузер, email, диалер
  • Запросить фото/видео/файл
  • Общее системное действие

Структура Intent

val intent = Intent(
    action = Intent.ACTION_VIEW,  // Действие
    data = Uri.parse("https://example.com"),  // Данные
    context = this,
    clazz = MainActivity::class.java  // Явный компонент
)

intent.apply {
    type = "text/plain"  // MIME-тип
    flags = Intent.FLAG_ACTIVITY_NEW_TASK  // Флаги
    putExtra("key", "value")  // Дополнительные данные
    putExtra("user", userObject)  // Сложные объекты
}

Компоненты Intent

1. Action — Действие

Intent.ACTION_VIEW  // Показать данные
Intent.ACTION_EDIT  // Отредактировать
Intent.ACTION_SEND  // Отправить
Intent.ACTION_SEND_MULTIPLE  // Отправить несколько
Intent.ACTION_DIAL  // Открыть диалер
Intent.ACTION_CALL  // Позвонить
Intent.ACTION_PICK  // Выбрать из списка
Intent.ACTION_GET_CONTENT  // Получить контент
Intent.ACTION_CREATE_SHORTCUT  // Создать ярлык

2. Data & Type

// URI данных
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://example.com")

// MIME-тип
intent.type = "image/*"
intent.type = "video/*"
intent.type = "audio/*"
intent.type = "text/plain"
intent.type = "application/pdf"
intent.type = "message/rfc822"  // Email
intent.type = "application/json"

// Одновременно data и type
intent.setDataAndType(uri, "image/jpeg")

3. Category — Категория

Intent.CATEGORY_DEFAULT  // Дефолт обработчик
Intent.CATEGORY_BROWSABLE  // Может открыть ссылку
Intent.CATEGORY_HOME  // Home экран
Intent.CATEGORY_LAUNCHER  // Может быть запущена с лаунчера

4. Extra — Дополнительные данные

val intent = Intent(this, DetailActivity::class.java)

// Примитивные типы
intent.putExtra("userId", 123)
intent.putExtra("userName", "Иван")
intent.putExtra("isActive", true)
intent.putExtra("rating", 4.5f)

// Массивы
intent.putExtra("ids", intArrayOf(1, 2, 3))
intent.putExtra("names", arrayOf("a", "b", "c"))

// Сложные объекты (Serializable)
intent.putExtra("user", user)  // User implements Serializable

// Parcelable (более эффективно)
intent.putExtra("product", product)  // Product implements Parcelable

// Bundle
val bundle = Bundle().apply {
    putInt("id", 123)
    putString("name", "Иван")
}
intent.putExtras(bundle)

// Получение данных
val userId: Int = intent.getIntExtra("userId", 0)  // default = 0
val userName: String? = intent.getStringExtra("userName")
val user: User? = intent.getParcelableExtra("user")

5. Flags — Флаги

// Флаги изменяют поведение запуска

Intent.FLAG_ACTIVITY_NEW_TASK
// Запустить в новой задаче (стеке активностей)

Intent.FLAG_ACTIVITY_SINGLE_TOP
// Если Activity уже на вершине стека, переиспользовать

Intent.FLAG_ACTIVITY_CLEAR_TOP
// Удалить все Activity выше целевой

Intent.FLAG_ACTIVITY_NO_HISTORY
// Не добавлять в стек истории

Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
// Очистить при сбросе задачи

val intent = Intent(this, MainActivity::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
startActivity(intent)

Практические примеры

1. Запуск другой Activity

val intent = Intent(this, ProfileActivity::class.java).apply {
    putExtra("userId", 456)
}
startActivity(intent)

// В ProfileActivity получение
val userId = intent.getIntExtra("userId", 0)

2. Запросить результат (startActivityForResult)

// Activity 1: запрашиваем результат
val intent = Intent(this, SelectUserActivity::class.java)
startActivityForResult(intent, SELECT_USER_REQUEST_CODE)

// Обработка результата
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == SELECT_USER_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        val user = data?.getParcelableExtra<User>("selected_user")
    }
}

// Activity 2: отправляем результат
val intent = Intent().apply {
    putExtra("selected_user", selectedUser)
}
setResult(Activity.RESULT_OK, intent)
finish()

3. Открыть фото

val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
intent.type = "image/*"
startActivityForResult(intent, PICK_IMAGE_CODE)

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == PICK_IMAGE_CODE && resultCode == Activity.RESULT_OK) {
        val imageUri = data?.data  // Content URI фото
        imageView.setImageURI(imageUri)
    }
}

4. Запустить Service

val intent = Intent(this, MyService::class.java)
startService(intent)  // Запустить
stopService(intent)   // Остановить

// Bound Service
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)

5. Отправить BroadcastReceiver

val intent = Intent("com.example.MY_BROADCAST")
intent.putExtra("message", "Hello")
sendBroadcast(intent)

Фильтры Intent (AndroidManifest.xml)

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name=".ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
</activity>

Проверка наличия обработчика

val intent = Intent(Intent.ACTION_SEND)
intent.type = "text/plain"

if (intent.resolveActivity(packageManager) != null) {
    startActivity(intent)
} else {
    Toast.makeText(this, "Приложение не найдено", Toast.LENGTH_SHORT).show()
}

Best Practices

  1. Явные Intents для собственных компонентов
  2. Неявные Intents для системных действий
  3. Всегда проверяй наличие обработчика перед startActivity
  4. Используй константы для REQUEST_CODE
  5. Передавай только нужные данные
  6. Используй Parcelable вместо Serializable
  7. Обрабатывай случай, когда обработчик не найден

Вывод: Intent — это фундаментальный механизм Android для запуска компонентов и передачи данных. Явные Intents используй внутри приложения, неявные — для системных действий.