티스토리 뷰

반응형

App Process와 System Process는 영역이 서로 다르므로, Intent를 System Process에 전달하기 위해서는 Intent를 복사해야 한다. 마찬가지로 AndroidManifest를 통해 부합하는 구성요소를 찾은 경우, 다시 App Process 영역으로 Intent를 전달하기 위해 Intent 객체를 App Process 영역에서 생성하여 복사한다. 그렇기 때문에, Intent를 통한 extra data 전달 시, 사용자가 정의한 객체 전달이 불가능하다.(App Process에서 정의한 객체정보를 System Process는 알지 못하기 때문에) 그래서 객체로 전달하기 위해서는 Serializable 이나 Parcelable을 이용하여 전달해야 한다. ( "Android Application 프로그래밍 초급 25강 Activity 1 T아카데미" )

 

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를 유지한다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함