반응형

이번 포스팅은 Android에서 Intent Filter에 대하여 알아보도록 하겠습니다.


다른 앱이 자신의 Activity를 시작할 수 있도록 하기 위해서는 AndroidMenifest 파일에서 <activity> 요소에 대해 <intent-filter> 요소를 추가해야 합니다.

 <intent-filter> 요소를 추가하면 시스템이 Intent-Filter를 식별하고 설치된 모든 앱에서 지원하는 Intent의 내부 카달로그에 해당 정보를 추가합니다. 앱이 암시적 인텐트로 startActivity() 또는 startActivityForResult()를 호출하면 시스템은 그 인텐트에 응답할 수 있는 Activity(들)을 찾습니다.


Intent-Filter 추가



Activity가 처리 가능한 Intent를 올바르게 정의하려면 Activity가 받아들이는 데이터와 추가하는 인텐트 필터가 구체적이어야 합니다.

Activity의 Intent-Filter가 Intent 객체의 다음 기준을 충족할 경우, 시스템이 주어진 Intent를 해당 Activity에 보낼 수 있습니다.


Action

수행할 작업의 이름을 지정하는 문자열입니다. 일반적으로, 플랫폼에서 정의하는 값 중 하나입니다(예: ACTION_SEND 또는 ACTION_VIEW).

<action> 요소를 사용하여 Intent-Filter에 지정합니다. 이 요소에 지정하는 값은 API 상수 대신 작업의 전체 문자열 이름이어야 합니다(다음 예제 참조).


Data

인텐트와 관련된 데이터에 대한 설명입니다.

<data> 요소를 사용하여 Intent-Filter에 지정합니다. 이 요소에서 하나 이상의 속성을 사용하여 MIME 유형, URI 접두사, URI 구성표 또는 이들의 조합 그리고 수락된 데이터 유형을 나타내는 다른 요소들을 지정할 수 있습니다.


Category

인텐트를 처리하는 Activity의 특징을 지정할 수 있는 추가적인 방법을 제공합니다. 일반적으로 사용자 제스처 또는 이러한 제스처가 시작된 위치와 관련되어 있습니다. 시스템이 지원하는 카테고리는 여러 가지가 있지만 대부분은 거의 사용되지 않습니다. 하지만 모든 암시적 인텐트는 기본적으로CATEGORY_DEFAULT로 정의됩니다.

<category> 요소를 사용하여 Intent-Filter에 지정합니다.


Intent-Filter에서 Activity가 허용하는 기준을 선언할 수 있습니다. 이는 이러한 각각의 기준을  <intent-filter> 요소 내에 해당 XML 요소를 중첩하여 선언하면 가능합니다.

예를 들어, 다음은 데이터 유형이 텍스트 또는 이미지인 경우 ACTION_SEND 인텐트를 처리하는 인텐트 필터가 지정된 Activity입니다.

<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"/>
       
<data android:mimeType="image/*"/>
   
</intent-filter>
</activity>

수신되는 인텐트는 각각 하나의 작업 및 하나의 데이터 유형만 지정합니다. 하지만 <intent-filter>의 <action><category> 및 <data> 요소에 대한 여러 인스턴스를 선언해도 문제가 되지는 않습니다.

action및 data의 두 쌍이 상호 배타적으로 동작할 경우, 어떤 데이터 유형과 페어링되었을 때 어떤 작업이 허용 가능한지를 지정하는 Intent-Filter를 각각 따로 생성해야 합니다.

예를 들어, Activity가 ACTION_SEND 및 ACTION_SENDTO 인텐트 모두에서 텍스트와 이미지 모두를 처리한다고 가정합니다. 이런 경우, 두 작업 각각에 별도의 인텐트 필터를 정의해야 합니다. 그 이유는 ACTION_SENDTO 인텐트는 데이터 Uri를 사용해서 send 또는 sendto URI 구성표를 사용하는 수신자 주소를 지정해야 하기 때문입니다.

<activity android:name="ShareActivity">
   
<!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
   
<intent-filter>
       
<action android:name="android.intent.action.SENDTO"/>
       
<category android:name="android.intent.category.DEFAULT"/>
       
<data android:scheme="sms" />
       
<data android:scheme="smsto" />
   
</intent-filter>
   
<!-- filter for sending text or images; accepts SEND action and text or image data -->
   
<intent-filter>
       
<action android:name="android.intent.action.SEND"/>
       
<category android:name="android.intent.category.DEFAULT"/>
       
<data android:mimeType="image/*"/>
       
<data android:mimeType="text/plain"/>
   
</intent-filter>
</activity>

참고: 암시적 인텐트를 수신하려면 인텐트 필터 안에 CATEGORY_DEFAULT 범주를 반드시 포함해야 합니다. startActivity() 및 startActivityForResult() 메서드는 모든 인텐트를 마치 CATEGORY_DEFAULT 범주를 선언한 것처럼 취급합니다. Intent-Filter에서 이 범주를 선언하지 않으면 어떠한 암시적 인텐트도 Activity로 확인되지 않습니다.


Activity에서 Intent 처리



Activity를 시작하는 데 사용된 Intent를 읽어 Activity에서 취할 작업을 결정할 수 있습니다.

Activity가 시작되면, getIntent()를 호출하여 Activity를 시작한 Intent를 검색합니다. 이 작업은 Activity의 수명 주기 동안 언제든지 가능하지만, 일반적으로 onCreate() 또는 onStart()와 같은 초기 콜백 과정에서 수행합니다.



Reference

1. https://developer.android.com/training/basics/intents/filters?hl=ko

반응형

'Development > Android' 카테고리의 다른 글

[Android] Android ABI 관리  (0) 2019.09.22
[Android] Touch 이벤트 순서  (0) 2019.09.10
[Android] Flexable Fragment UI 구축  (0) 2019.09.06
[Android] App Fragment Test  (0) 2019.09.06
[Android] Fragment의 생성  (0) 2019.09.06

+ Recent posts