본문 바로가기
Android

인텐트 필터 작성하고 테스트해보기

by 박새영 2021. 11. 27.

 

인텐트 필터가 있는 액티비티 시작하기

연락처를 보여주는 액티비티 인텐트 필터

<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을 정의해야합니다.

vendor-specific MIME 포맷

 

 

 

 

 

 

 

 

 

 

연락처 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 권한으로 시작해야합니다.