IntentFilter란?

Intent는 명시적 인텐트와 암시적 인텐트로 나뉩니다. 그중 암시적 인텐트를 통해 사용자로 하여금 어느 앱을 사용할지 선택하도록 하고자 할때 IntentFilter가 필요합니다.

예를 들어 사용자가 다른 사람들과 공유했으면 하는 콘텐츠를 가지고 있는 경우, ACTION_SEND라는 Action 있는 인텐트를 생성한 다음 공유할 콘텐츠를 지정하는 Extra를 추가하면 됩니다. 해당 인텐트로 startActivity()를 호출하면 사용자가 어느 앱을 통해 콘텐츠를 공유할지 선택할 수 있습니다.

주의: 개발자가 startActivity()로 전송한 암시적 인텐트를 처리할 앱이 사용자에게 전혀 표시되지 않을 수도 있습니다. 이런 일이 발생하면, 호출이 실패하고 앱이 작동 중단됩니다. 어느 액티비티든 이 인텐트를 수신하도록 확실히 하려면, Intent 객체의 resolveActivity()를 호출합니다. 결과가 null이 아닌 경우, 인텐트를 처리할 수 있는 앱이 최소한 하나는 있다는 뜻이며 startActivity()를 호출해도 안전합니다. 결과가 null이면, 해당 인텐트를 사용해서는 안 되며 가능한 경우 해당 인텐트를 발생시키는 기능을 비활성화해야 합니다.

암시적 인텐트 수신하기

앱에서 암시적인텐트를 수신하려면 앱의 컴포넌트에 대해 하나이상의 <intent-filter>를 메니페스트에 선언해야합니다. 각 인텐트 필터가 인텐트의 Action, Data, Category를 근거로 어느 유형의 인텐트를 허용하는지 나타냅니다. 시스템이 컴포넌트에 암시적 인텐트를 전달하는 것은 인텐트가 개발자가 선언한 인텐트 필터 중 하나가 일치하는 경우입니다. 

인텐트 필터는 하위 요소로 다음과 같은 유형을 지정할수 있습니다.

Intent Filter의 하위 요소 설명
<action> name 속성에서 허용된 인텐트 작업을 선언합니다. 이 값은 문자열 값이어야 합니다.
<data> 허용된 데이터 유형을 선언합니다. 이때 하나이상의 속성을 사용하여 데이터 URI와 MIME유형을 나타냅니다.
<category> name 속성에서 허용된 인텐트 카테고리를 선언합니다. 이 값은 문자열 값이어야 합니다.

인텐트 필터 예시

<activity android:name="MainActivity">
    <!-- This activity is the main entry, should appear in app launcher -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name="ShareActivity">
    <!-- This activity handles "SEND" actions with text data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <action android:name="android.intent.action.SEND_MULTIPLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.google.panorama360+jpg"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="video/*"/>
    </intent-filter>
</activity>
<activity android:name="MainActivity">
    <!-- 애플리케이션의 진입 액티비티, 런처에서 나타납니다 -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name="ShareActivity">
    <!-- 이 액티비티는 텍스트데이터와 함께 SEND 액션을 수행합니다 -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <!-- 이 액티비티는 미디어데이터와 함께 SEND와 SEND_MULTIPLE을 수행합니다-->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <action android:name="android.intent.action.SEND_MULTIPLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.google.panorama360+jpg"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="video/*"/>
    </intent-filter>
</activity>

첫 번째 액티비티인 MainActivity는 앱의 주요 진입 지점입니다. 즉 이것은 사용자가 시작 관리자 아이콘을 사용하여 앱을 처음 시작할 때 열리는 액티비티입니다.

  • ACTION_MAIN 작업은 이것이 주요 진입 지점이며 어느 인텐트 데이터도 기대하지 않는다는 것을 나타냅니다.

  • CATEGORY_LAUNCHER 카테고리는 이 액티비티의 아이콘이 시스템의 앱 시작 관리자에 배치되어야 한다는 것을 나타냅니다. <activity> 요소가 아이콘을 icon으로 지정하지 않은 경우, 시스템은 <application> 요소로부터 가져온 아이콘을 사용합니다.

이들 두 가지가 짝을 이루어야 액티비티가 앱 시작 관리자에 나타날 수 있습니다.

두 번째 액티비티인 ShareActivity는 텍스트와 미디어 콘텐츠 공유를 용이하게 할 목적으로 만들어진 것입니다. 사용자가 MainActivity에서 이 액티비티로 이동하여 진입할 수도 있지만, 두 가지 인텐트 필터 중 하나와 일치하는 암시적 인텐트를 발생시키는 또 다른 앱에서 ShareActivity에 직접 진입할 수도 있습니다.

카테고리: Tutorial

1개의 댓글

성빈 · 2023년 6월 27일 6:53 오후

정리 감사합니다!

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.