인텐트 필터가 있는 액티비티 시작하기
연락처를 보여주는 액티비티 인텐트 필터
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:mimeType="vnd.android.cursor.dir/contact"
android:scheme="content" />
</intent-filter>
액션
- android.intent.action.VIEW 유저에게 정보를 표시합니다.
- action은 컴포넌트가 수행하는 작업입니다. 인텐트 필터에 action이 없으면 인텐트를 수신할 수 없습니다.
카테고리
- android.intent.category.DEFAULT 카테고리는 암시적 인텐트를 수신하려면 포함해야합니다. 인텐트 필터에서 선언하지 않으면 액티비티에서 암시적 인텐트를 받을 수 없습니다.
데이터
- 데이터 테스트
- 데이터 테스트는 인텐트의 데이터 URI와 MIME 타입 둘다 필터 안에서 지정된 URI(scheme, host, path 등)과 MIME 유형과 비교합니다.
- 인텐트 필터와 인텐트는 서로 정의한게 매치되어야 테스트에 통과합니다.
- 예를 들어, 인텐트에 URI와 MIME 타입 둘중 하나만 지정하면 인텐트필터에서도 하나만 지정해야 데이터 테스트에 통과합니다. 둘다 지정하지않았다면 인텐트 필터에서도 둘다 지정하지 않아야 통과합니다
- 여기서는 인텐트 필터 데이터에 mimeType과 URI 유형(scheme) 둘다 지정했으므로 인텐트 또한 둘다 지정해야 테스트를 통과합니다.
- vnd.android.cursor.dir/contact : 테이블에 대한 mime type입니다.
- mime type은 해당 컴포넌트에서 제공하는 데이터 타입입니다.
- mime type에는 text/html 처럼 표준 타입을 정의할 수 있고,
- 테이블 데이터를 제공하는 경우에는 Android의 vendor-specific MIME 포맷으로 mime type을 정의해야합니다.
연락처 URI 인텐트로 액티비티 시작하기
앱에서 액티비티 시작하기
Intent().apply {
action = Intent.ACTION_VIEW
addCategory(Intent.CATEGORY_DEFAULT)
data = ContactsContract.Contacts.CONTENT_URI
}
- 인텐트에 Contacts URI 데이터를 담아 시작하면 연락처를 보여줄 수 있는 앱이 실행됩니다.
- 데이터 테스트
- 인텐트에 URI 데이터만 담아 시작했지만, URI에서 MIME 타입이 명시적이거나 유추 가능하다면 컴포넌트의 인텐트 필터 데이터에 URI와 MIME 타입 둘다 지정되어 있을경우 테스트에 통과할 수 있습니다.
- Contacts URI에서 유추된 타입은 intent filter 데이터의 mime type과 일치합니다.
- vnd.android.cursor.dir/contact
- 패키지명을 명시하지 않은 암시적 인텐트를 시작하면 시스템에서 인텐트를 처리할 수 있는 앱을 찾습니다. 시스템은 해당하는 패키지에 여러개의 패키지가 있으면 다이알로그를 표시해 유저가 선택하게 합니다.
- 앱에서 인텐트를 작성해 startActivity()로 전달해 시작하면 인텐트 필터를 작성한 액티비티와 안드로이드 기본 연락처앱을 둘 중 하나를 선택하라는 다이알로그가 표시됩니다.
am 도구로 액티비티 시작하기
- am은 액티비티 매니저 도구입니다.
- 액티비티 인텐트 필터를 테스트하기 위해 adb의 am 도구를 사용할 수 있습니다.
adb shell am start [options] intent
- 작성한 인텐트로 액티비티를 시작합니다.
adb shell am start -a android.intent.action.VIEW -d content:// -t vnd.android.cursor.dir/contact
- 암시적 인텐트로 액티비티를 시작합니다.
- 여기서는 type과 uri 둘다 지정합니다. uri만 지정하면 테스트에 통과하지 않습니다. (adb shell am으로 인텐트를 보내면 타입을 유추해서 추가해주는 과정이 없는것같음)
- 데이터를 지정할때 ://가 없으면 URI로 인식하지 않습니다.
결과
딥링크로 시작하는 액티비티의 인텐트 필터
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="android_playground"
android:host="*" />
</intent-filter>
- URI를 검색할 수 있는 액티비티의 인텐트 필터입니다.
- android.intent.category.BROWSABLE 카테고리는 URI를 검색해줄수 있는 액티비티에 포함해야합니다.
- 인텐트 필터에 scheme와 host와 path를 정의해주면 해당하는 URI가 있는 인텐트를 받을 수 있습니다.
URI 인텐트로 액티비티 시작하기
앱에서 액티비티 시작하기
- 인텐트에 CATEGORY_BROWSABLE 카테고리를 추가하고, 검색할 URI를 지정하고 시작하면 URI를 검색해줄 앱이 시작됩니다
- Intent().apply { action = Intent.ACTION_VIEW addCategory(Intent.CATEGORY_BROWSABLE) data = Uri.parse("http://") }
am 도구로 액티비티 시작하기
adb shell am start -d android_playground://
- URI만 있는 암시적 인텐트로 액티비티를 시작할 수 있습니다.
브로드캐스트 리시버로 브로드캐스트 인텐트 받기
- android.intent.action.LOCALE_CHANGED
- 브로드캐스트 리시버의 인텐트 필터로 기기 언어가 변경될때 시스템에서 보내는 인텐트를 수신할 수 있습니다.
- 브로드캐스트 리시버의 인텐트 필터 action에 android.intent.action.LOCALE_CHANGED 으로 기기 언어가 변경될때 시스템에서 보내는 브로드캐스트 인텐트를 수신합니다.
<receiver
android:name=".LocaleChangedBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.LOCALE_CHANGED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
브로드캐스트 인텐트 보내기
adb shell am broadcast -a android.intent.action.LOCALE_CHANGED -n com.benxcorp.android_playground/.LocaleChangedBroadcastReceiver
- 패키지를 지정한 명시적 인텐트를 보냅니다.
- android 8 이상은 앱을 구체적으로 타겟팅하지 않는 암시적 브로드캐스트를 보낼 수 없습니다.
- broadcast 인텐트를 보내려면 adb shell을 root 권한으로 시작해야합니다.
'Android' 카테고리의 다른 글
안드로이드 신입 과제 면접 회고 (0) | 2023.05.06 |
---|---|
[Glide] 이미지 로딩 시 자동으로 이루어지는 다운 샘플링 (0) | 2022.08.10 |
Android Task (0) | 2021.11.14 |
Android MVP 아키텍처 (0) | 2021.10.30 |
Activity의 생명주기, Life Cycle (0) | 2020.04.02 |