본문 바로가기
Android/Chapter

[Android] Chapter2. Intent Filter(인텐트 필터)

by hyun's life_developer 2019. 10. 7.

 

안녕하세요 초보개발자 시아아빠입니다.

 

앞서 암시적 인텐트에 대하여 설명을 하였고 이 암시적 인텐트를 처리하려면 인텐트 객체에 들어 있는 여러 정보를 이용해야 합니다. 

 

//Filter : 여과장치

 

이때 인텐트 객체 내의 여러 정보들을 바탕으로 가장 적절한 컴포넌트를 찾는 과정을 인텐트 해석(Intent Resolving)이라 합니다. 이 과정에서 인텐트 객체의 정보와 각 컴포넌트의 정보를 비교하게 되며, 이를 위해 각 컴포넌트는 자신이 받을 수 있는 인텐트의 종류를 Manifest에 정의하게 됩니다. 이를 Intent Filter(인텐트 필터)라고 합니다.

 

안드로이드 시스템 내부에서는 수많은 어플리케이션들에 의해 수많은 인텐트들이 발생하고 이 중에서 자신에게 필요한 

인텐트만을 받기 위해 Intent Filter가 존재합니다. 그렇지만 Intent Filter가 없다고 하여 인텐트를 받을 수 없는 것은 아닙니다. 말씀드렸다시피 Intent Filter는 인텐트 해석 과정이 필요한 암시적 인텐트(Implicit Intent)를 받을 때만 필요할 뿐, 호출 대상 컴포넌트가 "명시"되어 있는 명시적 인텐트(Explicit Intent)는 이러한 인텐트 필터가 없어도 해당 컴포넌트를 호출할 수 있습니다.

 

* Intent Filter의 구성요소

 - Intent Filter는 인텐트 객체 내의 정보들을 바탕으로 인텐트를 필터링하기에 인텐트 객체 내의 정보들을 바탕으로 자신이 받을 수 있는 정보들을 정의하며, 이 정보들 중 Intent Filter에서 주로 필터링하는 항목은 action, data, category입니다.

 

이러한 Intent Filter의 내용들을 어플리케이션이 실행되기 전에 안드로이드 시스템에서 알고 있어야 다른 어플리케이션에서 해당 어플리케이션의 컴포넌트를 필요로 하는 Intent를 발생시켜도 해당 컴포넌트를 실행시킬 수 있습니다.

그렇기때문에 Intent Filter의 내용들은 Manifest의 각 컴포넌트 태그 내에 정의됩니다.

 

ex

<activity
            android:name=".FirstActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

 

* Intent Filter내의 각 속성들

1. action Filter (액션 필터)

 - Intent객체 내의 action을 검사하여 intent-filter에 정의된 액션과 일치하는지 여부를 검사합니다. 이 검사를 통과하려면 Intent객체 내의 액션이 intent-filter에 정의된 액션과 일치해야 합니다.

Intent객체 정의된 액션 == intent-filter에 정의된 액션 이 되어야합니다.

, Intent액션이 아예 정의되어있지 않은 경우에는 action filter를 통과할 수 있습니다.

 

2. category Filter (카테고리 필터)

- Intent 객체 내의 category를 검사하여 intent-filter에 정의된 카테고리와 일치하는지 여부를 검사합니다. 

action 검사에서는 아예 정의되어 있지 않은 경우 통과할 수 있었지만 category에서는 intent 객체에 정의된 category가 intent-filter에 정의된 카테고리들과 일치해야 합니다. 

intent 객체의 category == intent-filter의 category가 되어야 합니다.

 

 

3. data Filter (데이터 필터)

- Intent 객체 내의 data 항목 및 type을 검사하여 intent-filter에 정의된 값과 비교하여 일치하는지 여부를 검사합니다. 

데이터 검사는 크게 데이터의 주소(URI)를 검사하는 부분과 데이터의 유형(type, MIME type)을 검사하나는 부분으로 나누어집니다. 

 

데이터의 주소를 검사하는 부분은 데이터의 주소를 세분화하여 검사할 수 있도록 되어있습니다. URI(Uniform Resource Identifier)는 다음과 같은 구조로 구성되어 있습니다.

scheme://host:port/path

https://siadaddy-cordinglife.tistory.com로 예를 든다면

scheme는 https가 host는 siadaddy-cordinglife.tistory.com이 됩니다.

 

데이터의 유형을 검사하는 부분은 다음과 같이 정의됩니다.

 

<data android:mimeType = "video/mpeg" android:scheme = "http">
<data android:mimeType = "audio/*" android:scheme = "http">

memeType은 위와 같은 형식으로 정의되고, 큰 범주/큰 범주의 하위범주 형식으로 정의됩니다.

ex) video가 큰 범주 / video의 하위범주가 mpeg

또한 "audio/*"와 같이 하위 범주에는 (*)를 사용하여 해당 범주 내의 모든 형식을 허용할 수 있습니다.

따라서 첫번째 data필터는 'http 스키마를 가진 mpeg 형식의 video' 데이터

두번째는 'http 스키마를 가진 모든 audio  데이터'를 가진 intent를 허용하는 것입니다.

 

 

댓글