[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
은 안드로이드 시스템의 NotificationManager
가 Intent
를 실행하게 되는데, 이것은 분명 다른 프로세스에서 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)
파라미터 정보
파라미터는 순서대로 아래와 같다.
Context
정보
requestCode
PendingIntent
를 가져올 때 구분하기 위한 고유 코드
- 실행할
Intent
- 플래그
FLAG_CANCEL_CURRENT
→ 이전에 생성한PendingIntent
취소 후 새로 생성FLAG_NO_CREATE
→ 이미 생성된PendingIntent
가 있다면 재사용 (없으면Null
리턴)FLAG_ONE_SHOT
→ 해당PendingIntent
를 일회성으로 사용FLAG_UPDATE_CURRENT
→ 이미 생성된PendingIntent
가 있다면, Extra Data 만 갈아끼움 (업데이트)
Author And Source
이 문제에 관하여([Android] PendingIntent 개념 익히기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@haero_kim/Android-PendingIntent-개념-익히기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)