인텐트 해석(Intent Resolving)
인텐트 객체 내의 여러 정보들을 바탕으로 가장 적절한 컴포넌트를 찾는 과정이다.
인텐트 객체 정보와 각 컴포넌트 정보를 비교하게 되며, 이를 위해 각 컴포넌트는 자신이 받을 수 있는 인텐트의 종류를 매니페스트 파일에 정의한다.
이를 인텐트 필터(Intent Filter)라 한다.
안드로이드 시스템 내부에서는 수많은 애플리케이션들에 의해 수많은 인텐트들이 발생한다.
이 중 자신에게 필요한 인텐트만을 받기 위해 인텐트 필터가 있는 것이다.
인텐트 필터가 없다고 해서 인텐트를 받을 수 없는 것은 아니다.
인텐트 필터는 인텐트 해석 과정이 필요한 암시적 인텐트(Implicit Intent)를 받을 때만 필요할 뿐,
호출 대상 컴포넌트가 명시되어 있는 명시적 인텐트(Explicit Intent)는 이러한 인텐트 필터가 없어도 대상 컴포넌트를 호출할 수 있다.
암시적 인텐트의 사용이유
명시적 인텐트를 사용하면 굳이 인텐트 필터를 정의할 필요도 없고, 간단히 컴포넌트를 호출할 수 있는데 왜 암시적 인텐트가 있는 것일까
"명시적" 인텐트의 이름에서도 알 수 있듯이, 명시적 인텐트는 호출 대상 컴포넌트의 이름을 정확히 알아야 하기 때문
val intent = Intent(this, SubActivity::class.java)
startActivity(intent)
자신이 만든 컴포넌트라면 컴포넌트의 이름을 정확하게 알겠지만, 다른 사람이 만든 컴포넌트의 이름을 알기란 어렵다.
즉, 명시적 인텐트를 사용하여 해당 컴포넌트를 호출할 수 없다. 따라서 암시적 인텐트를 통해 컴포넌트를 호출한다.
컴포넌트가 처리해야 할 작업만을 명시한다면 특정 작업 처리를 여러 가지 애플리케이션을 통해 처리 가능
val intent = Intent(Intent.ACTION_DIAL)
val TEST_DIAL_NUMBER = Uri.fromParts("tel", "5551212", null)
intent.data = TEST_DIAL_NUMBER
startActivity(intent)
인텐트 필터 속성
1. action (액션) 필터
인텐트 객체 내의 action을 검사하여 인텐트 필터에 정의된 액션과 일치하는지 여부를 검사
이 검사를 통과하려면 인텐트 객체 내의 액션이 인텐트 필터에 정의된 액션과 일치해야 한다.
단, 인텐트에 액션이 아예 정의되어있지 않은 경우에는 액션 필터를 통과가 가능하다.
위에서 보면 인텐트 객체에 정의된 액션의 이름과 인텐트 필터에 정의된 액션의 이름이 조금 다른데, 사실 표현 방식만 다르지 결국은 똑같은 값이다. Intent 클래스의 API를 보면, Intent 객체 내의 상수로 정의된 ACTION_VIEW ACTION_VIEW의 실제 값은 android.intent.action.VIEW 인 것을 확인할 수 있다.
2. category (카테고리) 필터
인텐트 객체 내의 category 항목을 검사하여 인텐트 필터에 정의된 카테고리와 일치하는지 여부를 검사
액션 검사에서는 인텐트 객체 내에 아예 액션이 정의되어있지 않은 경우 액션 검사를 통과할 수 있었던 것에 반해
카테고리 검사는 인텐트 객체에 정의된 카테고리가 인텐트 필터에 정의된 카테고리들과 일치해야 한다.
예를 들면, 인텐트 필터에서 CATEGORY_DEFAULT가 정의되어 있을 경우
카테고리로 CATEGORY_DEFAULT를 가지는 인텐트 객체, com.androidhuman.TEST_CATEGORY를 가지는 객체, 혹은 둘 다 가지고 있는 인텐트 객체가 카테고리 검사를 통과할 수 있다.
하지만, CATEGORY_DEFAULT는 가지고 있는데 com.androidhuman.NEW_CATEGORY를 가지는 인텐트 객체의 경우 인텐트 필터에서 NEW_CATEGORY가 정의되어있지 않으므로 카테고리 검사를 통과할 수 없다.
이 때문에, 암시적 인텐트를 만들 때 카테고리를 추가하지 않을 경우 안드로이드에서 자동으로 CATEGORY_DEFAULT(android.intent.category.DEFAULT)를 android.intent.category.DEFAULT 추가해 주게 된다.
때문에 카테고리를 특별히 추가해주지 않은 인텐트를 받을 수 있게 하려면 카테고리 필터에 android.intent.category.DEFAULT android.intent.category.DEFAULT를 추가해줘야 한다.
그렇지 않으면 어떠한 암시적 인텐트도 받을 수 없게 된다.
3. data (데이터) 필터
인텐트 객체 내의 data 항목 및 type을 검사하여 인텐트 필터에 정의된 값과 비교하여 일치 여부를 검사
데이터 검사는 데이터의 주소(URI)를 검사하는 부분과 데이터의 유형(type, MIME type)을 검사하는 부분으로 나눔
데이터의 주소를 검사하는 부분은 데이터의 주소를 세분화하여 검사할 수 있도록 되어있다.
URI(Uniform Resource Identifier)는 다음과 같은 구조로 구성되어 있다.
scheme://host:port/path
만약, http://google.com을 각 요소별로 나누어본다면 scheme는 http, host는 google.com 이 된다.
이와 마찬가지로 안드로이드 시스템에서 사용하는 주소들도 각각의 요소들로 나눌 수 있다.
예를 들어 content://com.androidhuman.provider.SimpleMemo/memos/1 같은 주소의 경우
scheme는 content, host는 com.androidhuman.provider.SimpleMemo,
path는 memos/1 이 된다.
데이터의 유형을 필터링하는 것은 type(mimeType)을 이용한다.
보통 아래와 같이 정의
<data android:mimeType = "video/mpeg" android:scheme = "http">
<data android:mimeType = "audio/*" android:scheme = "http">
mimeType은 위와 같은 형식으로 정의되며, 큰 범주/큰 범주의 하위 범주 형식으로 정의
(video/mpeg의 경우 큰 범주가 video, video의 하위 범주가 mpeg)
하위 범주에는 와일드카드 문자(*)를 사용하여 해당 범주 내의 모든 형식을 허용 가능하다.
이런 방식으로 첫 번째 <data> 필터를 해석하면 "http 스키마를 가진 mpeg 형식의 비디오 데이터"를 가진 인텐트를 허용하는 것임을 알 수 있고, 두 번째 필터는 "http 스키마를 가진 모든 오디오 데이터"를 가진 인텐트를 허용하는 것임을 알 수 있다.
Intent Filter
https://androidhuman.tistory.com/262 [커니의 안드로이드 이야기]
'Android > Reference' 카테고리의 다른 글
RecyclerView Scroll (0) | 2020.10.28 |
---|---|
Multi View Type RecyclerView (0) | 2020.10.28 |
RecyclerView Click Event (0) | 2020.10.28 |
xml에서 opacity(투명도) 넣기 (0) | 2020.10.28 |
screenOrientaion 지정 방법 (0) | 2020.10.28 |