Android - Intent (인텐트)

Android 2016. 2. 26. 09:51 posted by TechNote.kr


Android 구조를 보다보면 intent 라는 용어가 자주 나온다. 

앞서 정리한 구성요소를 시작하는 방식에서도 intent가 나오는데 이 구성요소와  intent의 관계 대해 정확한 이해를 하고,

이 intent의 종류, 구성에 대해 확인해 보자.


Intent


-. 일종의 메세지 객체

-. 여러 구성요소 사이(다른 앱의 구성요소일지라도)의 통신을 가능하게 함


구성요소 정리시에도 학습하였지만 Intent를 통해서 다음과 같은 동작이 가능하다

1. Activity (액티비티) 시작하기

2. Service (서비스) 시작하기

3. Broadcast (브로드캐스트) 전달하기



Intent 의 종류


명시적 인텐트, 암시적 인텐트.


Intent는 구성요소 시작하게 하거나, 구성요소에 data 를 전달하기 위한 목적으로 사용된다.


여기서 중요한 포인트가 구성요소이다.


이 구성요소를 명시적으로 지정하여 intent를 전달할 경우 해당 intent를 명시적 intent.

지정하지 않고 intent를 전달할 경우 암시적 intent라고 한다.


 System은 intent 안에 구성요소가 정의되어 있을 경우 바로 해당 구성요소에 intent를 전달하고,

명시된 구성요소의 정의가 없을 경우 System은 App들내의 AndroidManifest.xml에 정의된 intent filter 를 확인하여 intent 가 수행하려는 작업이 있는 구성요소를 사용자에게 선택할 수 있도록 UI를 보여주어 선택하게 한다. 이 때 선택된 구성요소에게 intent를 전달하게 된다. 


단,  Service의 경우 보안을 위해 명시적 intent만 사용할 수 있도록 하였다.

Service의 경우 UI가 없어 어느 서비스가 시작되는지 알수 없기 때문에 보안상의 목적으로 명시적 intent만 사용이 가능하다.



Intent 의 구성


구성요소 이름, 작업 내용, 데이터, 카테고리, 추가 데이터, 플래그


-. 구성요소 이름 : 구성요소 이름이 정의 되어 있을 경우 명시적 인텐트, 없을 경우 암시적 인텐트

-. 작업 내용, 데이터 : 데이터와 연동되어 어떤 작업을 할지 정의.

ACTION_VIEW  content://contacts/people/ABC

예를 들어 위와 같은 경우 ACTION_VIEW는 작업내용, 뒤에 항목을 ABC라는 사람의 연락처를 의미하는 데이터


-. 카테고리 : 대부분의 인텐트에서는 사용하지 않지만 해당 항목은 인텐트를 처리해야 할 구성요소의 종류에 관한 추가 정보를 의미


-. 추가 데이터 : 위의 데이터 이외에 키-값 쌍으로 추가 정보를 더 담을 수 있는 항목


-. 플래그 : 인텐트에 대한 메타데이터와 같은 기능



[2016.02.26 추가]

Broadcast를 통한 Intent 전송시 지연 문제


위에 언급되었다 시키 Intent를 이용하는 경우는 3가지로 Activity를 실행하거나, Service를 실행하거나, 기 실행되어 있는 Activity/Service에 Data를 전달하기 위한 용도로 사용된다.


최근 경험했던 이슈인데, Broadcast로 Intent를 전달하고 등록된 Intent receiver를 통해 해당 Intent를 전달받는 경우였는데, 그 시간이 10초 이상 걸리는 경우가 있었다.


[Log]

02-24 23:14:42.321 1375-1375/me.thispage.memo.memo E/OhMemo: Send update broadcast

02-24 23:14:54.161 1375-1375/me.thispage.memo.memo I/OhMemo: = onReceive() =

아무리 반복해도 10초가 계속 넘어가고 있었다.


해당 Intent는 APP에서 내용 변경시 Widget내용도 업데이트하기 위해서 보낸 것이었는데, 이렇게 되면 실시간이 되지 못하여 사용자의 입장에서는 업데이트가 안되는 것으로 오인될 수 있어 문제의 소지가 있었다.

(결국 10여초 기다리면 되긴하지만 문제의 소지가 있음)


당시 사용한 Intent 이름은 "android.appwidget.action.APPWIDGET_UPDATE"

Widget이 주기적으로 업데이트될 때 사용하는 공식적인 Intent를 사용하였다.


[문제의 해결]

자료를 좀 더 찾아보니 Intent가 전달되면 등록된 Receiver에서 순차적으로 처리한다고 한다. 따라서 Widget의 경우는 주기적인 Widget update를 위해 android.appwidget.action.APPWIDGET_UPDATE Intent 를 모두 공통적으로 처리하게 되어 있어 다량의 Receiver가 등록되어 있다. 이로 인해 해당 Intent를 전달받기 까지 다소 시간이 지연되었던 것이었다. 


이에 따라 나만의 Intent 이름을 정의하여 처리하니 바로 전달되고 처리되는 것을 확인할 수 있었다.


[결론]

Broadcast한 Intent가 예상한 시간에 receive되지 않을 경우, 해당 Intent 이름을 처리하기 위한 receiver 를 등록한 APP들이 많은 것은 아닌지 확인해 보고, Intent 이름을 바꾸어 보도록 하자.