기본적으로 일반적인 Intent의 "지연된" 또는 "예약된" 실행을 가능하게 합니다. 이를 통해 다른 앱이나 안드로이드 시스템이 애플리케이션이 실행 중이지 않을 때에도 특정 작업을 대신 실행할 수 있도록 합니다.

Intent vs PendingIntent

사용방법

val requestCode: Int = Random().nextInt()
val intent: Intent = Intent(this, MainActivity::class.java)
val pendingIntent: PendingIntent = PendingIntent.getActivity(
    this,
    requestCode,
    intent,
    PendingIntent.FLAG_UPDATE_CURRENT
)

여러가지 Flags

PendingIntent의 flag는 PendingIntent의 생성 및 재사용 방식을 결정합니다.

  1. FLAG_ONE_SHOT: 이 플래그는 PendingIntent가 한 번 사용된 후에는 더 이상 사용될 수 없음을 나타냅니다. 사용 후에는 자동으로 취소됩니다.
  2. FLAG_NO_CREATE: 이 플래그가 설정되면, PendingIntent를 생성하지 않고 기존의 PendingIntent를 검색만 합니다. 만약 해당하는 PendingIntent가 이미 존재하지 않으면 null을 반환합니다.
  3. FLAG_CANCEL_CURRENT: 이 플래그가 설정되면, 기존에 존재하는 PendingIntent를 취소하고 새로운 것을 생성합니다. 이는 기존의 데이터를 덮어쓰고 싶을 때 유용합니다.
  4. FLAG_UPDATE_CURRENT: 기존에 존재하는 PendingIntent가 있을 경우, 그 PendingIntent의 내용을 새로운 Intent의 내용으로 업데이트합니다. 이 플래그는 데이터를 최신 상태로 유지하고자 할 때 자주 사용됩니다.

Android12 대응

Android 12부터는 모든 PendingIntent에 FLAG_IMMUTABLE 또는 FLAG_MUTABLE 중 하나를 명시적으로 설정해야 합니다.

if (android.os.Build.VERSION.SDK_INT >= 23) {
  // FLAG_IMMUTABLE을 사용하여 PendingIntent 생성
    val intent = Intent(this, ExampleActivity::class.java)
    val pendingIntent = PendingIntent.getActivity(
        this,
        0,
        intent,
        PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE
    )
} else {
  // PendingIntent를 생성하는 기존 코드
}