일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 백준
- recyclerview
- LiveData
- Navigation
- hilt
- notification
- onMeasure
- BOJ
- Behavior
- ViewModel
- CollapsingToolbarLayout
- AppBarLayout
- onLayout
- activity
- Algorithm
- DataBinding
- CoordinatorLayout
- CustomView
- 코틀린
- View
- room
- HTTP
- Coroutine
- kotlin
- lifecycle
- sqlite
- 안드로이드
- 알고리즘
- Android
- 알림
- Today
- Total
개발일지
Android in A..Z - Intent 본문
Intent
Intent는 Android에서 메시지를 전달하는 객체입니다. 주로 Activitiy, Service, Broadcast같은 Android 요소들 사이에서 메시지를 전달하는 역할을 수행합니다.
위 그림은 startActivity를 처리하는 과정입니다. Activity나 Service같은 Android 요소들은 직접 생성해서 사용하는 것이 아닌 Intent를 통해 Android Framework에 요청하여 사용하게 됩니다. 요청할 때 Intent에 데이터를 넣어서 보낼 수 있습니다.
인텐트 유형
- 명시적 인텐트 : Intent를 처리할 요소를 명시적으로 정하는 방식입니다. Context와 처리할 요소의 정보(패키지명, 클래스 이름)를 명시적으로 정하여 인텐트를 전송합니다.
- 암시적 인텐트 : Intent를 처리할 요소를 정하지는 않지만 어떤 요소에 전달할지 Action, Category, Type, Data등을 정해서 인텐트를 전송합니다. 인텐트를 처리할 때 해당 조건에 맞는 요소를 사용자가 직접 선택할 수 있습니다. (ex 파일 선택을 하는 Intent를 전송할 때 파일 선택할 수 있는 어플이 여러개면 사용자가 직접 고를 수 있다.)
인텐트 구성요소
Component Name
구성요소 이름, 명시적 인텐트로 전송할 때 사용합니다. 보통 같은 앱안에서 Activity나 Service같이 이름을 알거나, 특정 요소에 전달할 때 사용합니다.
Intent(this, MainActivity::class.java)
Action
암시적 인텐트를 전송할 때 넣는 값으로 해당 Action을 처리할 수 있는 요소에게 Intent를 보냅니다. 보통 기존의 정의된 Action을 사용합니다. 하지만 사용자가 String 형식으로 새로운 Acion을 정의할 수 있습니다.
* AndroidManifest에서 Intent-Filter를 사용해서 Action을 처리할 수 있다고 정의할 수 있습니다.
* Intent Action Constant ( https://developer.android.com/reference/android/content/Intent?hl=ko#constants_1)
* Setting Action Constant ( https://developer.android.com/reference/android/provider/Settings?hl=ko#constants_1)
Intent(Intent.ACTION_CALL)
Data
작업을 수행할 때 참조하는 데이터의 Uri입니다. 예를들어 ACTION_EDIT인 경우 편집할 데이터의 Uri가 들어가야 합니다.
* Data와 MIME Type을 설정하려면 setDataAndType()을 호출해야 합니다.
Intent().apply {
data = Uri.parse("tel:01012345678")
}
Intent().apply {
type = "text/*"
}
Intent().apply {
setDataAndType(Uri.parse("Something"), "Something")
}
Category
Intent를 수신하는 요소의 Category다. CATEGORY_LAUNCHER, CATEGORY_BROWSER 등이 있습니다.
Intent().apply {
addCategory(Intent.CATEGORY_DEFAULT)
removeCategory(Intent.CATEGORY_DEFAULT)
}
Extra
메시지를 보낼 때 데이터를 같이 보내야 하는 경우가 있습니다. Extra를 통해 Key-Value 형식으로 추가할 수 있습니다.
Serializable이나 Parceble 객체도 보낼 수 있습니다.
Intent().apply {
putExtra(Intent.EXTRA_TEXT, "Text")
putExtra("hi", "hello")
}
Flag
Flag를 설정하여 Android Framework가 어떻게 처리할지 설정할 수 있다.
Intent().apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
Chooser
Intent를 처리할 수 있는 Component가 여러개 있을 때 고르는 창이 나타난다.
* startActivity를 할 때 연결할 수 있는 구성 요소가 없으면 Exception이 발생된다. resolveActivity()가 null인지 확인하여 연결할 수 있는 요소가 있는지 알 수 있다.
Intent("com.taetae98.action.EDIT").apply {
addCategory(Intent.CATEGORY_DEFAULT)
type = "text/*"
}.also {
if (it.resolveActivity(packageManager) != null) {
resultToGetString.launch(it)
resultToGetString.launch(Intent.createChooser(it, "Halo"))
} else {
Toast.makeText(this, "There is no available application.", Toast.LENGTH_SHORT).show()
}
}
Intent-Filter
AndroidManifest.xml에서 Intent-Filter를 설정하여 Intent의 Action을 처리할 수 있다.
<activity
android:name=".CategoryActivity"
android:label="Category"
android:exported="true">
<intent-filter>
<action android:name="com.taetae98.action.EDIT" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.taetae98.category" />
// Optional
<data android:mimeType="text/*" />
</intent-filter>
</activity>
<activity
android:name=".NumberInputActivity"
android:exported="true"
android:label="Number">
<intent-filter>
<action android:name="com.taetae98.action.EDIT" />
<category android:name="android.intent.category.DEFAULT" />
// Optional
<data android:mimeType="text/*" />
</intent-filter>
</activity>
<activity
android:name=".TextInputActivity"
android:exported="true"
android:label="Text">
<intent-filter>
<action android:name="com.taetae98.action.EDIT" />
<category android:name="android.intent.category.DEFAULT" />
// Optional
<data android:mimeType="text/*" />
</intent-filter>
Git (예제코드)
https://github.com/KangTaeJong98/Example/tree/main/Android/Intent
'Android (안드로이드)' 카테고리의 다른 글
Android in A..Z - Span (0) | 2021.09.16 |
---|---|
Android in A..Z - Module 베포 (Jitpack) (0) | 2021.09.02 |
Android In A..Z - Google API (Google Map) (0) | 2021.08.18 |
Android in A..Z - WebView Bridge (0) | 2021.08.05 |
Android in A..Z - Flow (0) | 2021.08.05 |