Android/Android
PendingIntent
혠꿍
2025. 3. 22. 16:14
pending intent에 대해 학습한다.
PendingInetnet
1. PendingIntent 란 ?
OS 시스템에서 유지하는 참조이다. 별도의 애플리케이션이 메모리에 살아있는지 아닌지 관계 없이 실행된다. 애플리케이션 A가 살아 있지 않아도 애플리케이션 B가 애플리케이션 A를 대신해 사전에 적의된 작업을 실행 할 수 있도록 애플리케이션 B가 PendingIntent를 전달할 수 있다.
Intent를 가지고 있는 클래스로 원하는 특정 시점에 Intent를 수행할 수 있도록 하는 특징을 가지고 있다. 또, 다른 프로세스에 Pending Intent를 전달하게 된다면 전달 받은 앱은 그 Intent를 본인의 소유처럼 수행 가능한 권한을 가지게 된다. 이런 이유로 다른 앱이 프로세스를 점유하고 있을 경우에도 Peding Intent에 정의된 액션이 정상적으로 실행이 가능하다.
2. PendingIntent 내부 구현은 ?
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags)
public static PendingIntent getActivities(Context context, int requestCode, Intent[] intent, int flags)
public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags)
public static PendingIntent getService(Context context, int requestCode, Intent intent, int flags)
PendingIntent는 호출하려는 컴포넌트에 따라 다른 생성자 메소드를 호출하게된다.
- getActivity(): Activitiy를 시작하는 경우
- getActivities(): 여러개의 Activity를 시작하는 경우 사용, Intent가 배열이다. 배열이기 때문에 순차적으로 실행된다.
- getBroadcast(): BroadcastReceiver를 시작하는 경우
- getService(): Service를 시작하는 경우
매개변수 | 설명 |
context | Context 객체 (ApplicationContext, Activity, Service 등) |
requestCode | PendingIntent를 구별하는 요청 코드 |
intent | 실행할 Intent |
flags | PendingIntent 동작 방식을 정의하는 플래그 |
RequestCode가 동일하면 시스템에서는 동일한 PendingIntent로 인식한다. 서로 다른 Intent를 전달해주기 위해선 코드를 다르게해 구별 해주어야한다.
3. Flag 종류
public static final int FLAG_ALLOW_UNSAFE_IMPLICIT_INTENT = 16777216;
public static final int FLAG_CANCEL_CURRENT = 268435456;
public static final int FLAG_IMMUTABLE = 67108864;
public static final int FLAG_MUTABLE = 33554432;
public static final int FLAG_NO_CREATE = 536870912;
public static final int FLAG_ONE_SHOT = 1073741824;
public static final int FLAG_UPDATE_CURRENT = 134217728;
- FLAG_UPDATE_CURRENT
- PendingIntent가 있으면 해당 Intent Extra 데이터를 업데이트하고 재사용한다.
- 새로운 Intent 객체를 생성하지만 PendingIntent는 기존 인스턴스를 유지한다.
- FLAG_CANCEL_CURRENT
- 기존 PendingIntent를 삭제하고 새로운 인스턴스를 생성한다.
- 기존 PendingIntent를 대기하던 이벤트가 있다면 취소된다.
- FLAG_NO_CREATE
- 해당 PendingIntent가 존재하는지 확인하는 용도이다.
- 있다면 PendingIntent를 반환하고 없으면 null을 반환한다.
- PendingIntent를 생성하지 않는다.
- FLAG_ONE_SHOT
- 생성 후 한번만 실행된다.
- 실행 후 자동으로 소멸된다.
Android12(API 31)부터 보안상 명시적인 Intent만 허용하기 위해 등장한 Flag이다. 필수 값이기 때문에 or 을 이용해 다중 Flag를 넘겨주어 PendingIntent를 생성한다.
- FLAG_IMMUTABLE
- 변경 될 수 없는 PendingIntent이다.
- 보안 강화를 위해 기본값으로 사용된다.
- FLAG_MUTABLE
- Intent를 변경할 수 있다.
- 필수로 필요한 경우가 아니라면 사용하면 안된다.
암시적인 PendingIntent를 사용해야 되는 경우도 있기 때문에 Android14(API 34)부터 등장한 Flag이다.
- FLAG_ALLOW_UNSAFE_IMPLICIT_INTENT
- 암시적 Intent는 여러 앱에서 받을 수 있기 때문에 보안에 취약하다.
- 해당 Flag없이 암시적 Intent를 사용할 경우 Exception이 발생한다.