반응형

이번 포스팅은 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
반응형

이번 포스팅에서는 객체를 Intent를 통해 전달하는 방법을 알아보겠습니다. 


정수같은 단순한 값은 크기도 작고 접근 속도도 빨라 저장하고 복귀하기 쉽습니다. 그러나 단일 값이 아닌 큰 객체나 배열을 저장할 때는 최대한 신속하게 저장하기 위해 좀 더 효율적으로 데이터 처리를 해야 합니다. 


객체를 저장할 때는 자바의 Serialize 기능을 사용하면 쉽게 구현할 수 있습니다. 자바는 언어 차원에서 객체를 일차원의 데이터로 저장하는 기능을 제공하는데 이 기능이 바로 Serialize 입니다. Serializable 인터페이스를 상속 받으면 디폴트 직렬화 알고리즘이 적용되어 클래스의 모든 인스턴스 필드가 순서대로 저장이 됩니다. 


1. 먼저 Intent로 전달한 객체에 Serializable 인터페이스를 상속 받습니다. 

   아래 그림처럼 빨간 네모 박스가 Serializable 인터페이스를 상속받은 구현방법입니다.



2. Serializable 인터페이스를 상속받은 객체를 Intent에 담아 전달 받을 클래스로 보냅니다.

   (※ Intent로 전달하기 전에 전달 받은 클래스가 AndroidManifest.xml에 등록이 되어 있어야 합니다.)



3. Intent를 전달받은 클래스에서는 getSerialzableExtra() 메소드로 불러오기만 하면 됩니다. 



- 아래는 결과 값인 Logcat 메시지 입니다.


참 간단하죠? 예제 소스를 압축 파일로 올려 놓았으니 필요하신 분들은 다운받아 실행해 보시면 좀 더 이해하기 쉬우실 것 같습니다. 

다음에 알차고 좋은 내용으로 찾아 뵙겠습니다.


SerializableExam.zip


반응형
반응형


지난 포스팅에 이어 이번 포스팅에서는 여러가지 Intent의 활용에 대해 알아 보도록 하겠습니다. 

예제는 화면 하단의 첨부파일로 제공하니 필요하신 분들은 다운 받아 보시기 바랍니다.


1. 소스 코드의 핵심 아래 그림과 같습니다.



2. 실행 예제 화면입니다.



- 마켓 바로가기 예제 (원마운트 앱)


- 사진 촬영하기 예제(캔디 카메라)


- 전송한 이미지 보기 예제


- 전화 걸기 예제


<첨부파일> IntentExample2.zip

반응형

+ Recent posts