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

В чем разница между Intent и PendingIntent?

2.2 Middle🔥 191 комментариев
#Android компоненты#Жизненный цикл и навигация

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

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

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

Разница между Intent и PendingIntent

Это два фундаментальных класса в Android, но с разными назначением и жизненным циклом.

Intent — это немедленное намерение

Intent — это объект, который описывает действие, которое нужно выполнить прямо сейчас. Это как устное поручение: вы говорите системе «запусти эту Activity» или «отправь это сообщение», и она выполняет команду немедленно.

// Intent используется для немедленного выполнения
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)

// Или отправка broadcast
val intent = Intent("com.example.MY_ACTION")
sendBroadcast(intent)

Основные характеристики Intent:

  • Выполняется немедленно
  • Используется для прямого запуска Activity, Service, Broadcast
  • Существует в памяти только во время вызова
  • Не может быть отменён, как только создан

PendingIntent — это отложенное намерение

PendingIntent — это обёртка над Intent, которая позволяет отложить выполнение на будущее. Это как письменное поручение, которое выполнится позже, другим процессом, с правами вашего приложения.

// PendingIntent для NotificationManager
val intent = Intent(this, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
    this,
    0,
    intent,
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

// Используется в notification
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
    .setContentIntent(pendingIntent)
    .build()

// Или для AlarmManager
AlarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtMillis, pendingIntent)

Основные характеристики PendingIntent:

  • Выполняется отложено (в будущем)
  • Используется для Notification, AlarmManager, Widget, WidgetProvider
  • Содержит в себе Intent + контекст для выполнения
  • Может быть отменён через cancel()
  • Выполняется с правами оригинального приложения

Ключевые отличия

ПараметрIntentPendingIntent
Время выполненияСразуВ будущем
Кто выполняетТекущий процессДругой процесс (система)
ОтменаНевозможнаВозможна (cancel())
ИспользованиеstartActivity(), sendBroadcast()Notification, AlarmManager, Widget
Жизненный циклКраткийДолгий
Права доступаТекущего приложенияСохранены в PendingIntent

Практический пример с AlarmManager

class AlarmScheduler {
    fun scheduleNotification(
        context: Context,
        delayMillis: Long
    ) {
        // Intent — что делать
        val intent = Intent(context, AlarmReceiver::class.java)
        intent.action = "com.example.ALARM_NOTIFICATION"
        
        // PendingIntent — как и когда это сделать
        val pendingIntent = PendingIntent.getBroadcast(
            context,
            ALARM_ID,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )
        
        // Расписываем выполнение на будущее
        val alarmManager = context.getSystemService(AlarmManager::class.java)
        alarmManager.setExact(
            AlarmManager.RTC_WAKEUP,
            System.currentTimeMillis() + delayMillis,
            pendingIntent
        )
    }
}

Флаги PendingIntent

  • FLAG_UPDATE_CURRENT — если PendingIntent существует, обновить его Intent
  • FLAG_IMMUTABLE — (обязателен с Android 12) PendingIntent нельзя изменить
  • FLAG_MUTABLE — (опасно) PendingIntent можно изменить
  • FLAG_CANCEL_CURRENT — отменить старый и создать новый

Вывод

Intent — это команда выполнить действие сейчас. PendingIntent — это отложенная команда, которая выполнится в определённый момент другим компонентом системы, но с правами вашего приложения. Понимание этой разницы критично для правильной работы с уведомлениями, будильниками и виджетами.

В чем разница между Intent и PendingIntent? | PrepBro