Intent와 Intent-filter의 역할
들어가며
학습목표
- Intent가 하는 역할을 살펴본다.
- Intent와 Intent-filter가 맺는 관계를 살펴본다.
- AndroidManifest.xml 에서, Intent-filter 부분을 살펴본다.
상황
- 특정 버튼을 클릭하면, 다른 Activity로 화면이 넘어가고 값이 전달되는 로직을 구성해야 했다.
- 아래의 XML 코드가 어떤 기능을 하는지 살펴보아야 했다.
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Intent란 무엇인가?
Intent의 기능
- Intent는 액티비티, 서비스, Broadcast Receiver, 콘텐츠 제공자라는 앱 컴포넌트 간 작업을 요청하거나 수행하며, 데이터를 전달하는 데 쓰인다.
- 안드로이드 개발자 문서에서는 크게 (1) 액티비티 시작 (2) 서비스 시작 (3) 브로드캐스트 전달 이라는 세 사례로 쓰임을 나눈다.
Intent의 형식
- Intent 객체는 작업을 수행할 구성 요소 판별에 필요한 정보를 담고 있다.
- Intent 객체는 (1) Action (2) Data (3) Category (4) Component Name (5) Extras (6) Flags 로 구성되어 있다.
- Action은 수행하려는 작업을 나타낸다.
- Data는 작업과 관련된 데이터로, 주로 Uri(Uniform Resource Information) 객체가 쓰인다.
- Category는 해당 액티비티가 어떤 종류의 카테고리에 속하는 지 지정한다.
- Extras는 Intent 내 키-값 쌍의 추가 정보를 다른 컴포넌트에 전달할 수 있게 해준다.
- putExtra() 메서드로 키-값 쌍을 추가하거나, Bundle 객체를 Intent에 putExtra()로 삽입할 수 있다.
- 키-값 쌍을 전달 받는 컴포넌트는 getExtra() 메서드를 이용할 수 있다.
- Flags는 Intent 동작을 제어하는 데 사용된다.
Intent의 유형
- 명시적 인텐트는 액티비티나 서비스의 클래스 이름을 명확하게 드러낸다.
- 암시적 인텐트는 시스템에 수행할 특정 작업을 요청하면, 시스템이 해당 작업을 처리할 수 있는 다른 구성요소를 찾아서 처리하도록 한다.
대표 예시
import android.content.Intent
val intent = Intent(this, TargetActivity::class.java)
startActivity(intent)
val webPageUri = Uri.parse("http://www.example.com")
val webIntent = Intent(Intent.ACTION_VIEW, webPageUri)
startActivity(webIntent)
- 명시적 인텐트에서 this는 현재 액티비티를 나타내고, TargetActivity는 이동할 목표 액티비티를 의미한다.
- 암시적 인텐트에서 Intent.ACTION_VIEW는 웹페이지를 여는 액션을 의미하고, Uri.parse()는 URL을 Uri로 변환하여 인텐트에 포함시킨다.
Intent-filter란 무엇인가?
Intent-filter의 역할
- Intent-filter는 안드로이드 매니페스트 파일 내에서 정의되어, 앱의 컴포넌트가 어떤 인텐트를 수신하고 처리할 것인지를 알려준다. 이는 곧 암시적 인텐트다.
- 시스템은 액션, 데이터, 카테고리에 따라 인텐트를 인텐트 필터에 비교한다. 모두 통과해야만 해당 인텐트가 컴포넌트에 전달된다.
- Intent 내의 모든 카테고리가 인텐트 필터에 선언된 카테고리에 속해야 한다. 카테고리가 없는 인텐트는 필터에 무관하게 비교를 통과한다.
XML 코드 이해
intent-filter 내 코드 살펴보기
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
- ACTION_MAIN 액션은 주요 진입지점인 동시에 어떤 인텐트 데이터도 기대하지 않음을 나타낸다.
- CATEGORY_LAUNCHER 카테고리는 해당 액티비티의 아이콘이 시스템의 앱 시작 관리자에 배치됨을 나타낸다.
- <action>, <data>, <category>는 각각 허용된 인텐트 작업, 데이터 유형, 인텐트 카테고리를 선언한다.