본문으로 바로가기

1. 인텐트(Intent)란?

Android 개발자 문서의 인텐트 및 인텐트 필터 페이지에는 아래와 같이 적혀져 있다.

Intent는 메시징 객체로, 다른 앱 구성 요소로부터 작업을 요청하는 데 사용할 수 있습니다.

 
즉 Intent는 다른 액티비티 혹은 서비스를 시작하기 위해 보내는 메시지이거나, 안드로이드 시스템에서 발생하는 이벤트들을 앱에게 알리기 위한 브로드캐스트를 전달하기 위한 메시지라고 설명할 수 있다.
 

2. 인텐트 유형

인텐트에는 두 가지 유형이 있다.

  • 명시적 인텐트

앱 내의 특정 액티비티나 서비스 등 특정한 앱 구성 요소를 시작하는 데 사용하는 인텐트이다. 이를 위해서 앱의 패키지 이름 혹은 구성 요소의 클래스 이름을 제공한다. 따라서 새로운 액티비티를 시작하거나, 백그라운드에서 파일을 다운로드하기 위한 서비스를 시작하는 것이 명시적 인텐트에 해당된다.
 

  • 암시적 인텐트

일반적인 작업을 선언하여 다른 앱의 구성요소가 이 작업을 처리할 수 있도록 하기 위해 사용하는 인텐트이다. 본인이 만드는 앱이 특정 작업을 처리할 수 없지만 다른 앱이 이 작업을 처리할 수 있거나 사용자가 어떤 앱을 사용할지 선택하기를 원할 때 암시적 인텐트가 사용된다.
 
Intent 객체에 포함되는 기본 사항은 구성 요소 이름, 작업, 데이터, 카테고리,  엑스트라, 플래그이며 각각의 의미는 안드로이드 개발자 문서의 인텐트 및 인텐트 필터>인텐트 빌드에 서술되어 있다.
 

3. 인텐트 필터(Intent Filter)란?

인텐트 필터는 앱의 매니페스트 파일에 들어 있는 표현으로 앱의 구성 요소가 수신하고자 하는 인텐트의 유형을 나타낸다.
인텐트 필터를 사용하는 예시로 암시적 인텐트가 있다.
명시적 인텐트의 경우 특정한 컴포넌트(앱의 패키지 이름 혹은 앱의 구성 요소)의 이름을 알고 있기 때문에 바로 해당 객체에 메시지를 보낼 수 있지만 암시적 인텐트의 경우 작업에 대한 내용만 정의되어 있기 때문에 어떤 컴포넌트에 메시지를 보내야 하는지 모른다. 
암시적 인텐트는 인텐트 필터에 있는 여러 인텐트와 비교하여 어떤 컴포넌트에 메시지를 전달할지 알 수 있다. 이때 호환되는 인텐트 필터가 여러개일 경우 사용자가 어느 앱을 사용할지 직접 선택할 수 있다.
 

안드로이드 개발자 문서 > 암시적 인텐트 실행 과정
암시적 인텐트 동작 과정

위 그림은 Activity A가 암시적 인텐트를 사용하여 Activity B를 실행시키는 과정이다.
Activity A가 작업이 설명되어 있는 Intent를 생성하여 이를 startActivity()에 전달(1)하면 Android System이 모든 앱의 매니페스트 파일에 들어있는 인텐트 필터를 검색하여 일치하는 항목을 검색(2)한다. 일치하는 항목을 찾으면 Android System은 해당 액티비티의 onCreate() 메서드를 호출하여 Intent에 전달하고 Activity B를 실행(3)시킬 수 있다. 
 

4. 인텐트 필터 생성 방법

위 예제에서 보이듯이 본인의 앱 구성요소가 수행할 수 있는 작업에 대하여 별도의 인텐트 필터를 생성하여 다른 앱이나 구성요소가 인텐트를 전달할 수 있도록 해야한다. 
인텐트 필터는 앱의 매니페스트 파일에 있는 <intent-filter> 사이에 정의하며 다음과 같은 세 가지 요소 중 하나 이상을 사용하여 허용할 인텐트 유형을 지정할 수 있다.

  • <action>

name 특성에서 허용된 인텐트 작업을 선언한다.

  • <data>

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

  • <category>

name 특성에서 허용된 인텐트 카테고리를 선언한다. 이때 암시적 인텐트를 수신하기 위해선 CATEGORY_DEFAULT 카테고리를 인텐트 필터에 포함해야 된다.
 

3줄 요약..

1. 인텐트는 다른 구성요소에게 보내는 메시지이다.
2. 인텐트는 명시적 인텐트, 암시적 인텐트로 나뉘며 암시적 인텐트는 인텐트 필터를 사용한다.
3. 인텐트 필터는 본인이 수행할 수 있는 인텐트를 찾기 위해 명시하는 필터이다.