티스토리 뷰
https://developer.android.com/guide/components/intents-filters?hl=ko#PendingIntent
* Intent : 시스템에서 안드로이드 구성요소에 데이터를 전달하기 위한 메시지 역할 수행
Intent를 전달받는 구성요소
- Activity : 앱 안의 단일화면으로써, Intent를 통해 Activity를 시작할 수 있음. ( startActivity, startActivityForResult )
- Service : 사용자와의 인터페이스 없이 백그라운드 작업을 수행하는 요소로써, Intent를 통해 Service를 시작할 수 있음 ( API 21 이하 : Service 클래스로 서비스 시작 , API 21 이상 : JobScheduler로 서비스 시작 )
- Broadcast Receiver : 모든 앱이 메시지를 수신받을 수 있는 요소로써, 시스템은 시스템 부팅, 충전 시작 등에 대한 이벤트를 전달받을 수 있음
Intent의 종류
- 암시적 인텐트 : 시스템은 모든 앱에 대하여 인텐트 메시지에 해당하는 구성요소를 찾아서 실행
- 명시적 인텐트 : Intent를 전달받을 요소에 대한 명시적인 정보를 포함. 따라서, 자신의 앱 내에서 주로 사용됨.(패키지 명 + 클래스 명 )
- * 참고 : Service를 동작시킬 경우, 명시적 인텐트를 사용. 암시적 인텐트는 원치않은 앱의 서비스가 실행되거나, 타 앱이 불필요하게 Service를 실행시킬 수 있음.
Intent의 구성요소
- ComponentName : 인텐트를 처리할 컴포넌트의 이름 ( 패키지 명 + 클래스 명 )
- Action : 수행할 액션의 이름을 나타내는 문자열 ( ex : ACTION_VIEW - 전달받은 데이터를 표출시켜주는 작업을 수행해, ACTION_CALL - 전달받은 데이터로 전화걸어주는 작업을 수행해 ... )
- Data : 액션이 수행될 데이터의 Uri와 MIME 타입. setData(가져올 데이터의 URI, 데이터를 실행시킬 MIME 타입)
- Category : 인텐트를 처리할 컴포넌트의 종류를 알려주는 추가 정보
( 참고 : CATEGORY_BROWSEBLE - 해당 액티비티는 브라우저를 통해 실행되며, 데이터를 통해 이미지, 메일 등의 링크로 참조된 데이터를 표출, CATEGORY_LAUNCHER - 해당 카테고리르 가지고 있는 액티비티에 아이콘이 지정되어 있으면, 시스템이 해당 아이콘을 앱의 아이콘으로 설정하고 없다면, <application>의 아이콘으로 설정함 )
- Extras : 해당 인텐트를 전달받고 작업을 수행할 추가적인 정보. key-value 쌍으로 전달 ( putExtra )
- Flag : 시스템에 액티비티를 실행시킬 방법에 대한 지침을 정의. (ex : 액티비티를 실행시키기 전의 특정 Task 에 소속되어야 한다던지... Task의 소속여부를 확인한다던지... )
IntentFilter
- 독립적으로 실행되는 컴포넌트가 자신의 특징을 기술하기 위해 사용되는 class.
- 자신이 처리할 수 있는 Action, Category, Data를 설정할 수 있도록 되어 있고, Priority를 지정할 수 있음
- AndroidManifest.xml의 컴포넌트에 IntentFilter가 설정되면 타 앱에서 호출이 가능한 컴포넌트가 됨
* PendingIntent : Intent를 감싸놓은 래퍼 역할을 하는 인텐트. 외부 앱을 허가하여, 외부 애플리케이션에 권한을 허가하여 안에 들어 있는 Intent를 마치 본인 앱의 자체 프로세스에서 실행하는 것처럼 사용하는 것
PendingIntent 정의
PendingIntent.{실행할 구성요소}({현재 앱의 Context},{감싸고자 하는 Intent},{Intent의 적절한 사용 방식을 나타내는 하나 이상의 플래그})
PendingIntent 사용 주요 사례
- Notification을 통해 특정 작업을 수행할 때 인텐트가 실행되도록 선언 (Android 시스템의 NotificationManager Intent를 실행)
- 앱 위젯을 통해 특정 작업을 수행할 때 인텐트가 실행되도록 선언 ( 메인 화면 앱이 Intent를 실행)
- 지정된 시간에 인텐트가 실행되도록 설정 (Android 시스템의 AlarmManager가 Intent를 실행)
PendingIntent를 전달받는 구성요소
- Activity : PendingIntent.getActivity 를 이용하여 Activity가 실행될 수 있도록 함
- Service : PendingIntent.getService 를 이용하여 Service가 실행될 수 있도록 함
- BroadcastReceiver : PendingIntent.getBroadcast를 이용하여 BroacastReceiver가 실행될 수 있도록 함
PendingIntent의 FLAG 종류
-FLAG_CANCLE_CURRENT : 이미 PendingIntent가 존재한다면, 새로운 PendingIntent를 생성하기 전에 기존 PendingIntent를 취소한다.
-FLAG_IMMUTABLE : 변경 불가능한 PendingIntent를 생성한다.
-FLAG_NO_CREATE : PendingIntent가 존재하지 않으면, 새로 PendingIntent 를 생성하지 않고 null을 반환한다.
-FLAG_ONE_SHOT : PendingIntent를 딱 한 번만 이용할때 사용한다.
-FLAG_UPDATE_CURRENT : 기존 PendingIntent가 존재한다면, 새로운 Intent의 extra data만을 변경시키고 PendingIntent를 유지한다.
'android' 카테고리의 다른 글
[android] 안드로이드 - 백그라운드 작업 시 UI 작업 진행 방법 (0) | 2020.05.28 |
---|---|
[android] 안드로이드 - 개념정리 : Context (0) | 2020.05.27 |
[android] DiffUtil - RecyclerView 의 효율적인 리스트 갱신을 위한 방법 (0) | 2020.05.19 |
[android] MVVM 패턴에서 ViewModel 객체가 생성되지 않을 때 (0) | 2020.05.17 |
[android] android studio 에서 release 버전으로 run 하는 법 (0) | 2020.04.14 |