Intent 정의
Intent(인텐트)는 다른 앱 구성 요소(Activity, Service, Broadcast Receiver)에서 작업을 요청하는 데 사용할 수 있는 메시지 객체
Intent는 어디에 사용되나요?
- Activity 시작
- Activity는 앱의 단일 화면
- Intent를
startActivity()
에 전달해 Activity의 새 인스턴스를 시작할 수 있음 - Intent를 통해 시작할 Activity와 필요한 데이터를 전달함
- Service 시작
- Service는 사용자 인터페이스 없이 백그라운드에서 작업을 실행하는 구성 요소
- Intent를
startService()
에 전달해 Service를 시작해 일회성 작업(파일 다운로드 등)을 실행할 수 있음 - Intent를 통해 시작할 Service와 필요한 데이터를 전달함
- Android 5.0(API 수준 21) 이상에서는 JobScheduler를 사용해 서비스를 시작할 수 있음
- Broadcast 전송
- Broadcast는 모든 앱이 수신할 수 있는 메시지로 시스템은 시스템이 부팅되거나, 기기가 충전을 시작할 때와 같은 시스템 이벤트에 다양한 브로드캐스트를 전송함
- Intent를
sendBroadcast()
또는sendOrderedBroadcast()
에 전달해 다른 앱에 브로드 캐스트를 전달할 수 있음
Intent 구성 요소
- ComponentName(구성요소 이름)
- 선택 사항이지만, 명시적 인텐트를 사용할 땐 중요한 정보이다.
- 구성 요소 이름이 없으면 인텐트는 암시적이며 시스템은 다른 인텐트 정보에 기반해 인텐트를 수신할 구성요소를 결정함
- 앱에서 특정 구성요소를 시작해야 하는 경우 구성요소 이름을 지정해야 함
- 서비스를 시작할 땐, 항상 구성요소 이름을 지정해야 함
- 작업
- 실행할 일반적인 작업을 지정하는 문자열
- ACTION_VIEW(갤러리 앱에서 볼 사진, 지도 앱에서 볼 주소 등이 있는 경우), ACTION_SEND(이메일 앱, 소셜 공유 앱 등을 통해 공유할 수 있는 데이터가 있는 경우) 등이 있음
- 데이터
- 작업할 데이터, 해당 데이터의 MIME 유형을 참조하는 URI
- 데이터의 MIME 유형을 지정하면 안드로이드 시스템이 인텐트를 수신하는 데 가장 적합한 구성요소를 찾는 데 도움이 됨
- 카테고리
- 인텐트를 처리해야하는 구성요소의 종류에 관한 추가 정보가 포함된 문자열
- 대부분의 인텐트에는 카테고리가 필요하지 않음
- CATEGORY_BROWSABLE, CATEGORY_LAUNCHER 등이 있음
- addCategory()로 카테고리를 지정할 수 있음
- 추가 항목
- 요청된 작업을 실행하는 데 필요한 추가 정보가 포함된 키-쌍 값
putExtra()
메서드를 사용해 데이터를 추가할 수 있음- 모든 추가 데이터로
Bundle
객체를 만든 다음,putExtras()
를 사용해 인텐트에Bundle
을 삽입할 수도 있음
- 플래그
- 인텐트의 메타데이터로 작동하는 인텐트 클래스에서 정의됨
- 플래그는 안드로이드 시스템에 액티비티를 시작하는 방법 및 액티비티가 시작된 후 액티비티를 처리하는 방법 등을 지시할 수 있음
setFlags()
를 사용해 추가 가능
Intent 유형
- 명시적 인텐트
- 암시적 인텐트
각 인텐트에 대해 더 자세하게 알아보자
명시적 인텐트
- 전체 ComponentName을 지정해, 어느 애플리케이션이 인텐트를 충족할지 지정
- 시작하려는 액티비티나 서비스의 클래스 이름을 알고 있으므로 일반적으로 명시적 인텐트를 사용해 자체 앱에서 구성요소를 시작함.
- 예를 들어, 앱 내에서 새 액티비티를 시작하거나 백그라운드에서 파일을 다운로드하는 서비스를 시작
val downloadIntent = Intent(this, DownloadService::class.java).apply {
data = Uri.parse(fileUrl)
}
startService(downloadIntent)
- 위 코드는 파일을 다운로드하는 서비스를 시작하는 명시적 인텐트의 예시다
- 인텐트 생성자로 DownloadService 라는 클래스를 명시적으로 제공하고 있기 때문

1. 액티비티 A는 작업 설명이 있는 인텐트를 만들어 startActivity()
에 전달
2. 안드로이드 시스템이 모든 앱에서 인텐트와 일치하는 인텐트 필터를 검색
3. 일치 항목이 발견되면, 시스템은 onCreate()
메서드를 호출하고, Intent에 전달해 액티비티 B를 시작함
암시적 인텐트
- 특정 구성요소의 이름을 지정하지 않고 대신 실행할 일반 작업을 선언하면, 다른 앱의 구성요소가 이를 처리하는 방식
- 예를 들어 사용자에게 지도상의 위치를 표시하고자 하는 경우, 암시적 인텐트를 사용해 기능을 갖춘 다른 앱이 지도에 지정된 위치를 표시하도록 요청
- 기기에서 작업을 실행할 수 있는 모든 앱을 호출할 수 있는 작업을 지정함
- 암시적 인텐트는 내 앱은 작업을 실행할 수 없지만, 다른 앱에서는 할 수 있고 개발자는 사용자가 사용할 앱을 선택하도록 하고자 할 때 유용하다!
- 안드로이드 시스템은 인텐트의 콘텐츠를 기기에 있는 다른 앱의 매니페스트 파일에 선언된 인텐트 필터와 비교한다
val sendIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, textMessage)
type = "text/plain"
}
// Try to invoke the intent.
try {
startActivity(sendIntent)
} catch (e: ActivityNotFoundException) {
// Define what your app should do if no activity can handle the intent.
}
- 위 코드는 사용자가 다른 사람과 공유하려는 콘텐츠가 있는 경우에 ACTION_SEND 작업을 사용해 인텐트를 만들고, 공유할 콘텐츠를 지정하는 추가 항목을 추가하는 예시다.
- 이 인텐트로
startActivity()
를 호출하면 사용자는 콘텐츠를 공유할 앱을 선택할 수 있다 - 시스템은 설치된 모든 앱을 검사해 ACTION_SEND 작업이 포함된 인텐트를 처리할 수 있는 앱을 파악함
인텐트 필터
<activity android:name="MainActivity" android:exported="true">
<!-- This activity is the main entry, should appear in app launcher -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="ShareActivity" android:exported="false">
<!-- This activity handles "SEND" actions with text data -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
<!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<action android:name="android.intent.action.SEND_MULTIPLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/vnd.google.panorama360+jpg"/>
<data android:mimeType="image/*"/>
<data android:mimeType="video/*"/>
</intent-filter>
</activity>
- 암시적 인텐트에서 인텐트 조건을 만족하는지 인텐트 필터를 통해 확인한다.
<intent-filter>
요소가 포함된 각 앱 구성요소(액티비티, 서비스 등..)에서android:exported
값을 설정하면 된다- true로 설정하면 다른 앱이 액세스 할 수 있다는 것이고, false는 다른 앱이 액세스 불가능하다는 의미다
참고
https://developer.android.com/guide/components/intents-filters?hl=ko#Types
'Native App > 👽Android' 카테고리의 다른 글
Fragment (0) | 2024.08.24 |
---|---|
안드로이드 네트워크 통신 라이브러리 Retrofit, OkHttp (2) | 2024.08.12 |
Context란 (0) | 2024.07.29 |
Kotlin을 사용하는 이유 (0) | 2024.07.26 |
Android 4대 컴포넌트 (0) | 2024.07.26 |
댓글