Android Basic

Intent 수신 및 Intent-filter

hik14 2020. 9. 24. 22:22

앱이 수신할 수 있는 암시적 인텐트가 어느 것인지 알리려면, 

<intent-filter> 요소를 사용하여 각 앱 구성 요소에 대해 하나 이상의 인텐트 필터를 매니페스트 파일에 선언합니다.

 

각 인텐트 필터는 인텐트의 Action, Data 및 Category를 기반으로 어느 유형의 인텐트를 수락하는지 지정합니다

시스템은 인텐트가 인텐트 필터 중 하나를 통과한 경우에만 암시적 인텐트를 앱 구성 요소에 전달합니다.

 

-명시적 인텐트는 항상 자신의 대상에게 전달되며, 이는 구성 요소가 어떤 인텐트 필터를 선언하든 무관합니다.

 

앱 구성 요소(Acitivtiy, Service,  Receiver, Provider)는 자신이 수행할 수 있는 각각의 고유한 작업에 대하여 별도의 필터를 선언해야 합니다.

 

예를 들어 이미지 갤러리 앱에 있는 어떤 액티비티에 두 개의 필터가 있을 수 있습니다.

한 필터는 이미지를 보고, 다른 필터는 이미지를 편집하기 위한 것입니다. 액티비티가 시작되면, Intent를 검사한 다음 Intent에 있는 정보를 근거로 어떻게 동작할 것인지 결정합니다. (편집기 제어 항목을 표시할 것인지 말 것인지 등).

 

 

각 인텐트 필터는 앱의 매니페스트 파일에 있는 <intent-filter> 요소에서 정의하고, 이는 대응되는 앱 구성 요소에서 중첩됩니다.

 

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

 

<intent-filter> 내부에서는 다음과 같은 세 가지 요소 중 하나 이상을 사용하여 허용할 인텐트 유형을 지정할 수 있습니다.

 

<action>

<action android:name="android.intent.action.SEND"/>

name 속성에서 허용된 인텐트 작업을 선언합니다.

이 값은 어떤 작업의 리터럴 문자열 값이어야 하며, 클래스 상수가 아닙니다

 

<data>

<data android:mimeType="text.plain"/>

허용된 데이터 유형을 선언합니다.

이때 데이터 URI(scheme, host, port, path)와 MIME 유형의 여러 가지 측면을 나타내는 하나 이상의 특성을 사용합니다.

 

 

<category>

<category android:name="android.intent.category.DEFAULT"/>

name 특성에서 허용된 인텐트 카테고리를 선언합니다.

이 값은 어떤 작업의 리터럴 문자열 값이어야 하며, 클래스 상수가 아닙니다.

 

 

-암시적 인텐트를 수신하려면 CATEGORY_DEFAULT 카테고리를 인텐트 필터에 포함해야 합니다. 

이 카테고리를 인텐트 필터에서 선언하지 않으면 액티비티에 어떤 암시적 인텐트도 확인되지 않습니다.

 

-startActivity()  startActivityForResult() 메서드는 마치 CATEGORY_DEFAULT 범주를 선언한 것처럼 모든 인텐트를 취급합니다. 

 

 

인텐트가 구성 요소에 전달되려면 세 가지 테스트(action, data, category)를 모두 통과해야 합니다.

그중 하나라도 통과하지 못하면 Android 시스템에서 해당 인텐트를 구성 요소에 전달하지 않습니다

구성 요소에는 여러 개의 인텐트 필터가 있을 수도 있으므로, 구성 요소의 필터 중 하나를 통과하지 않는 인텐트도 다른 필터를 통하면 성공할 수 있습니다.

 

 

주의:

인텐트 필터를 사용하면 다른 앱이 여러분의 구성 요소를 시작할 위험이 있습니다.

인텐트 필터는 구성 요소가 특정한 종류의 암시적 인텐트에만 응답하도록 제한하기는 하지만, 다른 개발자가 여러분의 구성 요소 이름을 알아내서 명시적 인텐트를 사용할 경우 다른 앱이 여러분의 구성 요소를 시작할 수도 있습니다.

 

자신의 앱만 구성 요소를 시작하는 것이 중요할 경우 매니페스트에 인텐트 필터를 선언하지 않는다.

구성 요소에 대해 exported특성을"false"로 설정하세요.

- exported 특성은 다른 앱이 이 구성요소를 사용할 수 있는지를 정한다.

 

마찬가지로 의도치 않게 다른 앱의 Service를 실행하는 일을 피하려면, 항상 명시적 인텐트를 사용하여 본인의 서비스를 시작하세요.

 

참고: 

모든 액티비티는 매니페스트 파일에서 인텐트 필터를 선언해야 합니다.

 

Broadcast Receiver의 필터는 registerReceiver()를 호출하여 동적으로 등록할 수 있습니다.

그런 다음 unregisterReceiver()를 사용하여 해당 수신기를 등록 해제할 수 있습니다.

이렇게 하면 앱이 실행되는 동안에 정해진 기간 동안만 특정한 브로드캐스트에 대해 수신 대기할 수 있습니다.

 

인텐트 필터 예시 

1.

<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>

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

 

CATEGORY_LAUNCHER 카테고리는 이 액티비티의 아이콘이 시스템의 앱 시작 관리자에 배치되어야 한다는 것을 나타냅니다.

 

<activity> 요소가 아이콘을 icon으로 지정하지 않은 경우, 시스템은 <application> 요소로부터 가져온 아이콘을 사용합니다.

 

2.

<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>

 ShareActivity는 텍스트와 미디어 콘텐츠 공유를 용이하게 할 목적으로 만들어졌습니다.

사용자가 MainActivity에서 이 액티비티로 이동하여 진입할 수도 있지만, 두 가지 인텐트 필터 중 하나와 일치하는 암시적 인텐트를 발생시키는 다른 앱에서 ShareActivity에 직접 진입할 수도 있습니다.