일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Design Pattern
- PrototypePattern
- 디자인패턴 #
- 추상팩토리패턴
- 팩토리 메소드
- 함수형프로그래밍
- F
- r
- Observer Pattern
- Abstract Factory
- designPattern
- 추상 팩토리
- 코틀린
- a
- ㅋㅁ
- ㅓ
- Singleton
- Kotlin
- El
- builderPattern
- 디자인패턴
- 빌터패턴
- 프로토타입 패턴
- 싱글톤
- Functional Programming
- factory method
- 옵저버 패턴
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
Intent 테스트 및 일치 본문
시스템이 액티비티를 시작하라는 암시적 인텐트를 수신하면, 시스템은 해당 인텐트에 대한 최선의 액티비티를 검색합니다. 이때 다음과 같은 세 가지 측면을 근거로 인텐트를 인텐트 필터에 비교합니다
- Action.
- Data(URI와 데이터 유형 둘 다).
- Category
인텐트 필터가 앱 매니페스트 파일에서 어떻게 선언되었는지에 따라 인텐트가 적절한 구성 요소에 어떻게 매칭되는지 확인해보자.
1. Action Test
<intent-filter>
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.VIEW" />
...
</intent-filter>
이 필터를 통과하려면 Intent에 지정된 작업이 필터에 나열된 작업 중 하나와 일치해야만 합니다.
필터에 나열된 작업이 없는 경우, 인텐트가 일치될 대상이 아무것도 없으므로 모든 인텐트가 테스트에 실패합니다.
하지만 Intent가 작업을 지정하지 않는 경우, 필터에 최소한 한 개 이상의 작업이 들어 있지 않다면 인텐트가 테스트를 통과하게 됩니다. (Intent의 작업이 지정되어 있지않고, 필터에도 작업이 없다면 통과)
2. Category Test
인텐트 카테고리를 나타내기 위해 인텐트 필터는 0개 이상의 <category> 요소를 선언할 수 있습니다
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
...
</intent-filter>
인텐트가 카테고리 테스트를 통과하려면 Intent 내의 모든 카테고리가 필터 내의 카테고리에 일치해야 합니다.
그 역은 반드시 성립하지 않아도 됩니다.
인텐트 필터가 Intent에서 지정된 것보다 더 많은 카테고리를 선언할 수 있지만, 그래도 Intent는 통과합니다.
그러므로 카테고리가 없는 인텐트라면 필터에 어떤 카테고리가 선언되어 있든 이 테스트를 항상 통과하는 것이 맞습니다.
참고: Android는 startActivity()와 startActivityForResult()에 전달된 모든 암시적 인텐트에 CATEGORY_DEFAULT 카테고리를 자동으로 적용합니다.
따라서 액티비티가 암시적 인텐트를 수신하기를 원하는 경우, 그 인텐트 필터 내에 "android.intent.category.DEFAULT"에 대한 카테고리가 반드시 포함되어 있어야 합니다
3. Data Test
허용된 인텐트 데이터를 나타내기 위해 인텐트 필터는 0개 이상의 <data> 요소를 선언할 수 있습니다.
각 <data> 요소는 URI 구조와 데이터 유형(MIME 미디어 유형)을 나타낼 수 있습니다.
URI의 각 부분은 별도의 특성(scheme, host, port, path)으로 구성됩니다.
URI = <scheme>://<host>:<port>/<path>
content: //com.example.project : 200 /folder/subfolder/etc
이 URI에서 구성표는 content, 호스트는 com.example.project, 포트는 200, 경로는 folder/subfolder/etc입니다.
이와 같은 특성은 각각 <data> 요소에서 선택 항목이지만, 서로 선형 종속성이 있습니다.
- scheme 가 지정되지 않으면 host가 무시됩니다.
- host가 지정되지 않으면 port가 무시됩니다.
- scheme와 host가 둘 다 지정되지 않으면 path가 무시됩니다.
인텐트 안의 URI가 필터 안의 URI 사양에 비교되는 경우, 이것은 필터 내에 포함된 URI의 몇몇 부분에만 비교되는 것입니다. 예를 들면 다음과 같습니다.
- 필터가 scheme만 지정하는 경우, 해당 sheme가 있는 모든 URI가 필터와 일치합니다.
- 필터가 scheme와 authority은 지정하지만 paht는 지정하지 않는 경우, 같은 scheme와 권한이 있는 모든 URI가 경로와 관계없이 필터를 통과합니다.
- 필터가 scheme, authority와 path를 지정하는 경우 같은 scheme, authority과 path가 있는 URI만 해당 필터를 통과합니다.
즉, 순서대로 1개만 일치되면 통과시킨다.
참고: path사양에는 경로 이름이 부분적으로만 일치하도록 요구하기 위해 와일드카드 별표(*)가 들어 있을 수 있습니다
데이터 테스트는 인텐트 안의 URI와 MIME 유형 둘 모두를 필터 안에서 지정된 MIME 유형과 비교합니다.
1. URI도 MIME 유형도 들어 있지 않은 인텐트는 필터가 URI나 MIME 유형을 전혀 지정하지 않은 경우에만 테스트를 통과합니다. 즉, 인텐트와 필터 모두 URI/MIME 지정하지 않으면 통과함.
2. URI는 들어 있지만 MIME 유형은 없는 인텐트(URI로부터는 명시적이지도 않고 추론할 수도 없음)는 그 URI가 필터의 URI 형식과 일치하고, 필터가 인텐트와 마찬가지로 MIME 유형을 지정하지 않는 경우에만 테스트를 통과합니다.
즉, URI만 지정한 인텐트는 URI 가 일치하고 MIME를 지정하지 않은 필터를 통과한다.
3. MIME 유형은 들어 있지만 URI는 없는 인텐트는 해당 필터가 같은 MIME 유형을 나열하지만 URI 형식은 지정하지 않은 경우에만 테스트를 통과합니다.
즉, MIME만 지정한 인텐트는 MIME가 일치하고 URI를 지정하지 않은 필터를 통과한다.
4. URI와 MIME 유형이 둘 다 들어 있는 인텐트(URI로부터는 명시적이지도 않고 추론할 수도 없음)는 해당 유형이 필터 내에 나열된 유형과 일치하는 경우에만 MIME 유형 부분의 테스트를 통과합니다.
이 인텐트는 URI가 필터 내의 URI와 일치하는 경우나, content: 또는 file: URI가 있고 필터가 URI를 지정하지 않은 경우에 URI 부분의 테스트를 통과합니다.
달리 말하면, 필터가 MIME 유형만 나열하는 경우, 구성 요소가 content: 및 file: 데이터를 지원하는 것으로 간주됩니다.
참고: 인텐트가 URI 또는 MIME 유형을 지정하는 경우, <intent-filter>에 <data> 요소가 없으면 데이터 테스트를 통과하지 못합니다.
- 카테고리와 달리 데이터는 인텐트에서 지정을 하면 그에 일치하는 필터가 없으면 통과 하지 못한다.
이 마지막 규칙인 규칙 (4)는 구성 요소가 파일 또는 콘텐츠 제공자로부터 로컬 데이터를 가져올 수 있다는 기대를 반영한 것입니다.
따라서 이런 필터는 데이터 유형만 나열할 수 있고, content: 및 file: scheme를 명시적으로 지명하지 않아도 됩니다.
다음 예시는 <data> 요소가 구성 요소가 콘텐츠 제공자에서 이미지 데이터를 가져와 표시할 수 있다고 Android에 알리는 일반적인 사례를 보여줍니다.
<intent-filter>
<data android:mimeType="image/*" />
...
</intent-filter>
데이터 유형은 지정하지만 URI는 지정하지 않는 필터가 가장 보편적일 것입니다. 그 이유는 대부분의 사용 가능한 데이터를 콘텐츠 제공자가 제공하기 때문입니다.
다른 보편적인 구성을 예로 들자면 shceme와 데이터 유형을 가진 필터가 있겠습니다.
예를 들어 다음과 같은 <data> 요소는 구성 요소가 작업을 수행하기 위해 네트워크에서 비디오 데이터를 검색할 수 있다고 Android에 알립니다.
<intent-filter>
<data android:scheme="http" android:mimeType="video/*" />
...
</intent-filter>
인텐트 일치되는 구성요소 확인하기.
인텐트를 인텐트 필터에 비교해 일치시키면 활성화할 대상 구성 요소를 찾아낼 수 있을 뿐만 아니라, 기기에 있는 일련의 구성 요소에 대해 무언가 알아낼 수도 있습니다.
예를 들어 홈 앱이 앱 시작 관리자를 채우려면 ACTION_MAIN 작업과 CATEGORY_LAUNCHER 카테고리를 지정하는 인텐트 필터를 가진 액티비티를 모두 찾아야 합니다.
인텐트의 action category 가 필터와 일치해야 매칭이 성공합니다.
애플리케이션은 홈 앱과 같은 방식으로 인텐트 매칭을 사용합니다.
PackageManager에 있는 query...() 메서드 집합은 특정 인텐트를 허용하는 구성 요소를 모두 반환하며, 이와 유사한 일련의 resolve...() 메서드는 한 인텐트에 응답하는 데 가장 좋은 구성 요소를 판별합니다.
- 아래와 같은 메서드로 일치하는 구성요소를 찾을 수 있다.
예를 들어 queryIntentActivities()는 인텐트를 인수로 전달할 수 있는 모든 액티비티의 목록을 반환하고 queryIntentServices()는 서비스와 관련하여 그와 유사한 목록을 반환합니다.
어느 메서드도 구성 요소를 활성화하지는 않습니다. 단지 응답할 수 있는 것을 나열하기만 합니다. 이와 유사한 메서드인 queryBroadcastReceivers()도 있는데, 이것은 Broadcast Receiver용입니다.
'Android Basic' 카테고리의 다른 글
ViewPager (0) | 2021.02.22 |
---|---|
Activity와 Fragment 생명주기 알아보기. (0) | 2021.02.19 |
Pending Intent(보류 인텐트) (0) | 2020.09.24 |
Intent 수신 및 Intent-filter (0) | 2020.09.24 |
Intent (0) | 2020.09.23 |