필자는 어느 날 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 만 갈아끼움 (업데이트)
완벽한 설명 너무 감사합니다.