Intent 란?
인텐트는 컴포넌트(액티비티, 서비스, 브로드캐스트 리시버)간에 통신을 하기 위한 메시지 객체 이다.
즉, 쉽게 말하자면 Component를 실행시키기 위해 시스템에 넘기는 정보이다.
Intent를 사용하는 방법은 여러가지가 있지만 일반적으로 3가지이다.
- 액티비티의 시작: startActivity(Intent), startActivityForResult(Intent, requestCode)
- 서비스의 시작: startService(Intent), bindService(Intent)
- 브로드케스트 전달: sendBroadcast(Intent), sendOrderedBroadcast(Intent), sendStickyBroadcast()
또한 인텐트의 유형으로는
명시적 인텐트(Explicit Intent)와 암시적 인텐트(Implicit Intent) 2가지가 존재한다.
명시적 인텐트 : 인텐트를 충족하는 앱이 뭔지 지정한다. 이를 위해 대상 앱의 패키지명 또는 구성 요소 클래스 이름을 제공한다. 일반적으로 앱 안에서 컴포넌트를 시작할 때 쓴다. 시작하려는 액티비티 또는 서비스의 클래스명을 알고 있기 때문이다.
// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
val downloadIntent = Intent(this, DownloadService::class.java).apply {
data = Uri.parse(fileUrl)
}
startService(downloadIntent)
(안드로이드 공식 문서 예제)
암시적 인텐트 : 특정 컴포넌트의 이름을 대지 않지만, 대신 수행할 일반적인 작업을 선언해 다른 앱의 컴포넌트가 이를 처리할 수 있도록 해준다. 사용자에게 지도의 한 위치를 표시하고자 하는 경우 암시적 인텐트를 써서 해당 기능을 갖춘 다른 앱이 지정된 위치를 지도에 표시하도록 요청할 수 있다.
// Create the text message with a string
val sendIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, textMessage)
type = "text/plain"
}
// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(packageManager) != null) {
startActivity(sendIntent)
}
(안드로이드 공식 문서 예제)
intent-filter(인텐트 필터)
- 인텐트 필터는 암시적 인텐트 실행을 위해 필요한 요소다
- 사용할 인텐트가 여러 종류면 그 개수만큼 인텐트 필터를 매니페스트에 만들어야 한다
인텐트 필터는 인텐트의 작업, 데이터 및 카테고리를 기반으로 어느 유형의 인텐트를 수락하는지 지정한다. 시스템은 인텐트가 인텐트 필터 중 하나를 통과한 경우에만 암시적 인텐트를 앱 구성 요소에 전달한다.
명시적 인텐트는 항상 자신의 대상에게 전달되며, 이는 구성 요소가 어떤 인텐트 필터를 선언하든 무관하다.
각 인텐트 필터는 앱의 매니페스트에 있는 <intent-filter> 요소에서 정의하고, 이는 대응되는 앱 구성 요소에서 중첩된다.
암시적 인텐트를 수신하려면 CATEGORY_DEFAULT 카테고리를 인텐트 필터에 포함해야 한다. 이 카테고리를 인텐트 필터에서 선언하지 않으면 액티비티에 어떤 암시적 인텐트도 확인되지 않는다.
여러 가지 종류의 인텐트를 처리하고자 하되 특정 조합의 작업, 데이터, 카테고리 유형으로만 한정하고자 할 때는 여러 인텐트 필터를 생성해야 한다.
참고 :
https://onlyfor-me-blog.tistory.com/384
https://developer.android.com/guide/components/intents-filters?hl=ko
https://www.charlezz.com/?p=857
'Android > Study' 카테고리의 다른 글
[Android] Coroutine(코루틴) 간단 정리 (0) | 2023.04.27 |
---|---|
[Android] 모듈을 기반으로하는 클린 아키텍처를 셋팅 (0) | 2023.02.22 |
[Android] Context 란? (0) | 2023.02.03 |
[Android] Fragment 생명주기(Life Cycle) (0) | 2023.01.14 |
[Android] Clean Architecture(클린 아키텍처) 란 (0) | 2023.01.07 |