← Назад к вопросам
Как определить 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
- Явные Intents для собственных компонентов
- Неявные Intents для системных действий
- Всегда проверяй наличие обработчика перед startActivity
- Используй константы для REQUEST_CODE
- Передавай только нужные данные
- Используй Parcelable вместо Serializable
- Обрабатывай случай, когда обработчик не найден
Вывод: Intent — это фундаментальный механизм Android для запуска компонентов и передачи данных. Явные Intents используй внутри приложения, неявные — для системных действий.