[Android] PendingIntent 개념 익히기

필자는 어느 날 Notification 푸시알림 기능을 개발하면서, 사용자가 푸시알림을 탭할 시 일어날 동작을 정의하기 위해 PendingIntent 라는 녀석을 사용하라고 해서 사용하곤 했다.

그러나 이것이 Intent 와 어떤 게 다른 건지 완벽하게 알지 못하고 넘어갔다. 따라서 이번 포스팅에선 필자가 이해하고 정리한 PendingIntent 의 개념에 대해 설명하고자 한다.

PendingIntent 란?

기본적으로는 Intent 를 가지고 있는 클래스이다. 한 가지 매우 중요한 특징이 있는데, Pending 이라는 단어의 사전적 의미에서 유추할 수 있다.

Pending'보류', '임박' 이런 뉘앙스를 갖고 있다. PendingIntent 는, 가지고 있는 Intent 를 당장 수행하진 않고 특정 시점에 수행하도록 하는 특징을 갖고 있다. 이 '특정 시점'이라 함은, 보통 해당 앱이 구동되고 있지 않을 때이다.

예를 들어 어떤 대용량 파일을 다운로드하는 동작을 구현할 때, 사용자들은 보통 대용량 다운로드를 가만히 기다리기 보다는 다른 앱을 사용하기 때문에, 다운로드가 다 되었을 때를 알리는 것이 효과적이다. 따라서 파일 다운로드를 완료했을 때 사용자에게 푸시알림을 쏴준다고 하자.

보통 이런 경우 어떤 식으로 구현돼있는가? 다운로드 완료 푸시알림을 탭하게 되면 앱으로 다시 복귀하여 특정 동작을 이어간다.

🤔 그런데 만약, 일반 Intent 로 해당 동작을 구현했다면 정상적으로 동작할까?

아니다. 왜냐하면 사용자가 다른 앱을 구동하고 있다는 뜻은, 다른 앱에서부터 내가 정의한 Intent 를 실행한다는 뜻이기 때문이다. 이는 불가능하다.

하지만 만약 PendingIntent 를 사용한다면, 특정 시점에 Intent 를 수행하는 것이 보장되어있기 때문에 정상적으로 실행된다. 이것이 어떻게 보장되는 걸까?

🔔 핵심은, Intent 가 수행되는 시점이 보통 '앱이 구동되고 있지 않을 때' 이므로, 다른 프로세스 (앱) 에게 권한을 허가하여 Intent 를 마치 본인 앱에서 실행되는 것처럼 사용하게 하는 것이다. 때문에 특정 시점에 Intent 가 무조건 수행될 수 있도록 보장되는 것이다.


보통 이런 곳에 사용하기 제격이다

몇 가지 대표적인 사례가 있다.

  • Notification (푸시알림) 으로 Intent 작업 수행시 사용
  • 바탕화면 (런쳐) 위젯에서 Intent 작업 수행 시 사용
  • AlarmManager 를 통해 지정된 시간에 Intent 작업 수행시 사용

이 녀석들의 공통점은?

그렇다. 해당 앱이 구동되고 있을 때 Intent 를 수행하는 것이 아닌, 분명 다른 앱이 프로세스를 점유하고 있을 때 실행된다는 점이 공통점이다.

대표적으로 Notification안드로이드 시스템의 NotificationManagerIntent 를 실행하게 되는데, 이것은 분명 다른 프로세스에서 Intent 를 수행하는 것이므로, Notification 으로 Intent 수행 시 PendingIntent 가 필수적이다.


PendingIntent 생성하기

컴포넌트의 유형에 따라 생성자를 호출하는 방식이 다르다.

Activity

PendingIntent.getActivity(Context, Int, Intent, Int)

Service

PendingIntent.getService(Context, Int, Intent, Int)

BroadcastReceiver

PendingIntent.getBroadcast(Context, Int, Intent, Int)

파라미터 정보

파라미터는 순서대로 아래와 같다.

  1. Context 정보
  1. requestCode
    • PendingIntent 를 가져올 때 구분하기 위한 고유 코드
  1. 실행할 Intent
  1. 플래그
    • FLAG_CANCEL_CURRENT
      → 이전에 생성한 PendingIntent 취소 후 새로 생성
    • FLAG_NO_CREATE
      → 이미 생성된 PendingIntent 가 있다면 재사용 (없으면 Null 리턴)
    • FLAG_ONE_SHOT
      → 해당 PendingIntent 를 일회성으로 사용
    • FLAG_UPDATE_CURRENT
      → 이미 생성된 PendingIntent 가 있다면, Extra Data 만 갈아끼움 (업데이트)

좋은 웹페이지 즐겨찾기