본문 바로가기
Native App/👽Android

Intent란

by yewoneeee 2024. 8. 5.

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

댓글