
필자는 어느 날 Notification 푸시알림 기능을 개발하면서, 사용자가 푸시알림을 탭할 시 일어날 동작을 정의하기 위해 PendingIntent 라는 녀석을 사용하라고 해서 사용하곤 했다.
그러나 이것이 Intent 와 어떤 게 다른 건지 완벽하게 알지 못하고 넘어갔다. 따라서 이번 포스팅에선 필자가 이해하고 정리한 PendingIntent 의 개념에 대해 설명하고자 한다.
기본적으로는 Intent 를 가지고 있는 클래스이다. 한 가지 매우 중요한 특징이 있는데, Pending 이라는 단어의 사전적 의미에서 유추할 수 있다.

Pending 은 '보류', '임박' 이런 뉘앙스를 갖고 있다. PendingIntent 는, 가지고 있는 Intent 를 당장 수행하진 않고 특정 시점에 수행하도록 하는 특징을 갖고 있다. 이 '특정 시점'이라 함은, 보통 해당 앱이 구동되고 있지 않을 때이다.
예를 들어 어떤 대용량 파일을 다운로드하는 동작을 구현할 때, 사용자들은 보통 대용량 다운로드를 가만히 기다리기 보다는 다른 앱을 사용하기 때문에, 다운로드가 다 되었을 때를 알리는 것이 효과적이다. 따라서 파일 다운로드를 완료했을 때 사용자에게 푸시알림을 쏴준다고 하자.

보통 이런 경우 어떤 식으로 구현돼있는가? 다운로드 완료 푸시알림을 탭하게 되면 앱으로 다시 복귀하여 특정 동작을 이어간다.
🤔 그런데 만약, 일반
Intent로 해당 동작을 구현했다면 정상적으로 동작할까?아니다. 왜냐하면 사용자가 다른 앱을 구동하고 있다는 뜻은, 다른 앱에서부터 내가 정의한
Intent를 실행한다는 뜻이기 때문이다. 이는 불가능하다.
하지만 만약 PendingIntent 를 사용한다면, 특정 시점에 Intent 를 수행하는 것이 보장되어있기 때문에 정상적으로 실행된다. 이것이 어떻게 보장되는 걸까?
🔔 핵심은,
Intent가 수행되는 시점이 보통 '앱이 구동되고 있지 않을 때' 이므로, 다른 프로세스 (앱) 에게 권한을 허가하여Intent를 마치 본인 앱에서 실행되는 것처럼 사용하게 하는 것이다. 때문에 특정 시점에Intent가 무조건 수행될 수 있도록 보장되는 것이다.
몇 가지 대표적인 사례가 있다.
Notification (푸시알림) 으로 Intent 작업 수행시 사용Intent 작업 수행 시 사용AlarmManager 를 통해 지정된 시간에 Intent 작업 수행시 사용이 녀석들의 공통점은?
그렇다. 해당 앱이 구동되고 있을 때 Intent 를 수행하는 것이 아닌, 분명 다른 앱이 프로세스를 점유하고 있을 때 실행된다는 점이 공통점이다.

대표적으로 Notification 은 안드로이드 시스템의 NotificationManager 가 Intent 를 실행하게 되는데, 이것은 분명 다른 프로세스에서 Intent 를 수행하는 것이므로, Notification 으로 Intent 수행 시 PendingIntent 가 필수적이다.
컴포넌트의 유형에 따라 생성자를 호출하는 방식이 다르다.
PendingIntent.getActivity(Context, Int, Intent, Int)
PendingIntent.getService(Context, Int, Intent, Int)
PendingIntent.getBroadcast(Context, Int, Intent, Int)
파라미터는 순서대로 아래와 같다.
Context정보
requestCode
PendingIntent를 가져올 때 구분하기 위한 고유 코드
- 실행할
Intent
- 플래그
FLAG_CANCEL_CURRENT
→ 이전에 생성한PendingIntent취소 후 새로 생성FLAG_NO_CREATE
→ 이미 생성된PendingIntent가 있다면 재사용 (없으면Null리턴)FLAG_ONE_SHOT
→ 해당PendingIntent를 일회성으로 사용FLAG_UPDATE_CURRENT
→ 이미 생성된PendingIntent가 있다면, Extra Data 만 갈아끼움 (업데이트)
완벽한 설명 너무 감사합니다.