Intent
인텐트
는 안드로이드 런타임에서 메시지를 주고받아 앱 구성요소로 부터 작업을 요청하는데 사용되는 일종의 메시지 객체
라고 볼 수 있습니다.
앱이 처음 시작되면 안드로이드 런타임은 인텐트
를 AndroidMenifest.xml
에 정의된 앱의 메인 액티비티
에 전달합니다.
1. 액티비티 시작하기
Activity의 새 인스턴스를 시작하기 위해선 새로 시작할 activity의 정보를 담은 Intent를 멤버함수인 startActivity()
로 전달하면 됩니다.
Activity가 finish 되었을 때 startActivityForResult()
를 호출하면 finish 될 액티비티는 결과를 수신받을 액티비티의 콜백 함수인 onActivityResult()
에 수신합니다.
2. 서비스 시작하기
UI 없이 백그라운드에서 작업을 수행하는 서비스는 JobScheduler
로 시작할 수 있습니다.
3. 브로드캐스트 전달
시스템 이벤트에 대한 다양한 브로드캐스트를 전달할 수 있습니다.
Explicit intent(명시적 인텐트)
명시적 인텐트는 일반적으로 앱에서 Acitvity나 Service같은 구성요소를 시작할 때 사용되며, 실행하고자 하는 Acitvity 또는 Service의 class name
을 사용하는 형태를 의미합니다.
Implicit intent(암시적 인텐트)
암시적 인텐트는 특정 구성 요소의 class name
을 알아야 할 필요는 없지만 수행할 작업을 선언하여 다른 앱의 구성 요소가 이를 처리할 수 있도록 할 때 사용하는 인텐트입니다.
암시적 인텐트의 동작원리를 예를들어 설명하자면, Main Activity
가 생성하여 Intent
를 startActivity()
에 넣어 Android System
에 전달하고, Android System이 기기에 설치된 모든 앱에서 해당 Intent
와 일치하는 AndroidMenifest.xml에 선언된 Intent Filter
를 검색하여 일치하는 항목을 찾아 해당 Activity
의 onCreate()
를 호출하여 Intent
를 전달하고 실행하게 되는데, 일치하는 Intent Filter
가 여러 앱에 존재하는 경우 Android System
에서 대화상자를 통해 선택할 수 있게 해줍니다.
tip : Activity에 대한 Intent Filter가 선언되지 않은 경우 해당 Activity는 다른 앱에 의해 시작될 수 없고, 보안을 위해 Service를 암시적 인텐트를 이용해 호출하지 않는 것이 좋습니다.
<Intent-filter>
인텐트 필터 정보는 안드로이드 시스템에 제공하는 정보로 A 앱에서 B 앱의 액티비티 호출할 수 있도록 필요한 정보를 담고있습니다.
A라는 App에 SubActivity를 생성하게되면 아래와 같은 내용이 AndroidMenifest.xml에 추가됩니다.
<activity android:name=".SubActivity3">
<intent-filter>
<action android:name="implicit.intent.action.TEST" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.APP_BROWSER" />
<category android:name="android.intent.category.APP_CALCULATOR" />
</intent-filter>
</activity>
<activity android:name=".SubActivity2">
<intent-filter>
<action android:name="implicit.intent.action.TEST" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.APP_BROWSER" />
</intent-filter>
</activity>
<activity android:name=".SubActivity">
<intent-filter>
<action android:name="implicit.intent.action.TEST" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<action> : 액티비티의 기능 유형을 의미하는 것으로 현재 액티비티가 어떤 인텐트 요청에 동작하도록 할 것인지를 결정합니다.
<category> : 액티비티에 대한 추가 정보로, 액티비티의 범주를 의미합니다. LAUNCHER, BROWSABLE, TAB, HOME 등이 있습니다.
<data> : 액티비티를 실행하기 위해 필요한 데이터에 대한 정보를 의미합니다. data는 URL 형식으로 표현되고, scheme, host, port, mimeType 등으로 구분하여 선언합니다.
B라는 App에서 아래와 다른 <action>은 같지만 다른 <category>의 <intent-filter>를 검색하도록 해봅시다.
//testcase1
class MainActivity : AppCompatActivity() {
val TAG = MainActivity::class.simpleName
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent = Intent("implicit.intent.action.TEST")
intent.addCategory(Intent.CATEGORY_DEFAULT)
startActivity(intent)
}
}
//testcase2
class MainActivity : AppCompatActivity() {
val TAG = MainActivity::class.simpleName
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent2 = Intent("implicit.intent.action.TEST")
intent2.addCategory(Intent.CATEGORY_DEFAULT)
intent2.addCategory(Intent.CATEGORY_APP_BROWSER)
startActivity(intent2)
}
}
//testcase3
class MainActivity : AppCompatActivity() {
val TAG = MainActivity::class.simpleName
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent3 = Intent("implicit.intent.action.TEST")
intent3.addCategory(Intent.CATEGORY_DEFAULT)
intent3.addCategory(Intent.CATEGORY_APP_BROWSER)
intent3.addCategory(Intent.CATEGORY_APP_CALCULATOR)
startActivity(intent3)
}
}
testcase1 | 일치하는 Intent Filter가 3개가 있어 AndroidSystem에서 대화상자를 통해 선택하도록 합니다. |
testcase2 | 일치하는 Intent Filter가 2개가 있어 AndroidSystem에서 대화상자를 통해 선택하도록 합니다. |
testcase3 | 일치하는 Intent Filter가 유일하기 때문에 SubActivity3가 호출됩니다. |
'Android' 카테고리의 다른 글
안드로이드 개념) WorkManager를 사용한 백그라운드 작업 - kotlin (0) | 2021.05.02 |
---|---|
[Android] 비동기 처리를 위한 방법 (0) | 2021.04.30 |
[Android] Activity 생명주기 (0) | 2021.04.09 |
AndroidProgramming - Listener 등록 (Kotlin) (0) | 2021.04.08 |
FCM (Firebase Cloud Messaging) (0) | 2021.04.03 |