티스토리 뷰
Intent
• 의도, 의사가 담긴 메시징 객체
• 다른 컴포넌트에게 작업을 요청할 때, 어떠한 작업을 요청하는지, 누구에게 요청하는지 등에 대한 정보를 인텐트 객체에 담아 전달한다.
• 데이터를 담아 전달할 수 있다.
ex) 010-0000-0000(데이터)로 전화해줘.
• 요청한 작업의 결과를 받을 수 있다.
Intent 종류
1. 명시적 인텐트 (Explicit Intent)
• 호출 대상을 명시하는 경우
ex) ㅇㅇ앱으로 사진 찍을거야 -> ㅇㅇ앱 호출 및 실행
2. 암시적 인텐트 (Implicit Intent)
• 호출 대상을 명시하지 않는 경우
ex) 사진 찍을거야 -> 사진 찍을 수 있는 모든 앱 호출
• 인텐트 필터 (Intent-filter)
- 매니페스트 파일에 인텐트 필터를 등록할 수 있다.
- 암시적 인텐트 시 인텐트 객체에 담긴 내용과 맞는 필터를 가진 컴포넌트를 호출한다.
ex) 사진 찍을거야 -> 사진 찍기라는 필터가 있는 모든 앱 호출.
Intent 가능 대상
• 앱 내
- 액티비티 끼리(화면 전환)
• 앱 외부
- 안드로이드 OS, 시스템
- 다른 앱(권한 필요)
Intent의 사용
1. 암시적 인텐트
• activity_intent_one06.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".IntentOne_06">
<TextView
android:id="@+id/implicitIntent"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FFFF00"
android:gravity="center"
android:text="암시적 인텐트" />
</androidx.appcompat.widget.LinearLayoutCompat>
• IntentOne_06.kt
- Intent 객체에 원하는 액션(여기서는 전화걸기) 입력.
-> 전화 걸기가 가능한 앱 모두 호출.
- startActivity(Intent) 함수 사용.
package com.example.fastcampus
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
class IntentOne_06 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent_one06)
// 암시적 인텐트
val implicitIntent: TextView = findViewById(R.id.implicitIntent)
implicitIntent.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL) // 원하는 액션 입력
startActivity(intent) // startActivity 함수 사용
}
}
}
• 결과
2. 암시적 인텐트 - 데이터 전달
• activity_intent_one06.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".IntentOne_06">
<TextView
android:id="@+id/implicitIntent"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FFFF00"
android:gravity="center"
android:text="암시적 인텐트" />
<TextView
android:id="@+id/implicitIntentWithData"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FF00"
android:gravity="center"
android:text="암시적 인텐트 - 데이터 전달" />
</androidx.appcompat.widget.LinearLayoutCompat>
• IntentOne_06.kt
- URI 형태로 데이터를 전달한다.
- 요청한 작업에 따라 전달하는 데이터의 방식도 달라진다.
-> 다 외울 순 없고 찾아보면서 하면 된다.
package com.example.fastcampus
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
class IntentOne_06 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent_one06)
// 암시적 인텐트
val implicitIntent: TextView = findViewById(R.id.implicitIntent)
implicitIntent.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL)
startActivity(intent)
}
// 암시적 인텐트 - 데이터 전달
val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
implicitIntentWithData.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111")) // 원하는 액션 입력 및 전화번호 데이터를 uri 형태로 전달.
startActivity(intent)
}
}
}
• 결과
3. 명시적 인텐트 - ComponentName 방식
• activity_intent_one06.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".IntentOne_06">
<TextView
android:id="@+id/implicitIntent"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FFFF00"
android:gravity="center"
android:text="암시적 인텐트" />
<TextView
android:id="@+id/implicitIntentWithData"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FF00"
android:gravity="center"
android:text="암시적 인텐트 - 데이터 전달" />
<TextView
android:id="@+id/explicitIntentComponentName"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FFFF"
android:gravity="center"
android:text="명시적 인텐트 - ComponentName 방식" />
</androidx.appcompat.widget.LinearLayoutCompat>
• activity_intent_two06.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".IntentTwo_06">
<TextView
android:id="@+id/text1"
android:layout_width="200dp"
android:layout_height="100dp"
android:background="#00FF00"
android:gravity="center"
android:text="IntentTwo_06 액티비티"/>
</androidx.constraintlayout.widget.ConstraintLayout>
• IntentOne_06.kt
- 호출할 컴포넌트(여기서는 IntentTwo_06 액티비티)를 ComponentName 객체에 명시.
- Intent 객체의 component 속성에 ComponentName 객체를 넣어 인텐트 대상 지목.
- ComponentName 방식의 경우 호출할 액티비티 이름을 String으로 직접 입력함.
-> String으로 직접 입력하면 오타의 가능성이 높고, 오타가 나더라도 오류가 뜨지 않아 알기 힘듦.
package com.example.fastcampus
import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
class IntentOne_06 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent_one06)
// 암시적 인텐트
val implicitIntent: TextView = findViewById(R.id.implicitIntent)
implicitIntent.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL)
startActivity(intent)
}
// 암시적 인텐트 - 데이터 전달
val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
implicitIntentWithData.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111"))
startActivity(intent)
}
// 명시적 인텐트 - ComponentName 방식
val explicitIntent1: TextView = findViewById(R.id.explicitIntentComponentName)
explicitIntent1.setOnClickListener {
val intent: Intent = Intent()
val componentName: ComponentName = ComponentName( // ComponentName 객체 생성
"com.example.fastcampus",
"com.example.fastcampus.IntentTwo_06" // 호출할 컴포넌트 이름을 String으로 직접 입력.
)
intent.component = componentName // Intent 객체의 component 속성에 ComponentName 객체를 넣어 호출할 대상 지목.
startActivity(intent)
}
}
}
• 결과
4. 명시적 인텐트 - Context 방식
• activity_intent_one06.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".IntentOne_06">
<TextView
android:id="@+id/implicitIntent"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FFFF00"
android:gravity="center"
android:text="암시적 인텐트" />
<TextView
android:id="@+id/implicitIntentWithData"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FF00"
android:gravity="center"
android:text="암시적 인텐트 - 데이터 전달" />
<TextView
android:id="@+id/explicitIntentComponentName"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FFFF"
android:gravity="center"
android:text="명시적 인텐트 - ComponentName 방식" />
<TextView
android:id="@+id/explicitIntentContext"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FF00FF"
android:gravity="center"
android:text="명시적 인텐트 - Context 방식" />
</androidx.appcompat.widget.LinearLayoutCompat>
• IntentOne_06.kt
- 현재 액티비티와 호출할 액티비티를 적는다.
- Context, Reflection(::) 등의 어려운 문법이 쓰이는데, 아직은 모든 문장을 이해할 필요 없다.
-> 써보면서 익히자.
- ComponentName 방식보다 Context 방식을 많이 쓴다.
package com.example.fastcampus
import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
class IntentOne_06 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent_one06)
// 암시적 인텐트
val implicitIntent: TextView = findViewById(R.id.implicitIntent)
implicitIntent.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL)
startActivity(intent)
}
// 암시적 인텐트 - 데이터 전달
val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
implicitIntentWithData.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111"))
startActivity(intent)
}
// 명시적 인텐트 - ComponentName 방식
val explicitIntent1: TextView = findViewById(R.id.explicitIntentComponentName)
explicitIntent1.setOnClickListener {
val intent: Intent = Intent()
val componentName: ComponentName = ComponentName(
"com.example.fastcampus",
"com.example.fastcampus.IntentTwo_06"
)
intent.component = componentName
startActivity(intent)
}
// 명시적 인텐트 - Context 방식
val explicitIntent2: TextView = findViewById(R.id.explicitIntentContext)
explicitIntent2.setOnClickListener {
val intent: Intent = Intent(this, IntentTwo_06::class.java) // 현재 액티비티와 호출할 액티비티를 적는다.
startActivity(intent)
}
}
}
• apply를 이용하여 View 변수 생성을 생략할 수 있다.
- apply는 객체 접근 시 객체 이름으로 호출할 필요없이 바로 접근할 수 있게 도와준다.
// 명시적 인텐트 - Context 방식
(findViewById<TextView>(R.id.explicitIntentContext)).apply { // 변수를 생성하지 않고 apply 사용.
this.setOnClickListener {
startActivity(Intent(this@IntentOne_06, IntentTwo_06::class.java))
// apply 안에서 this는 지금 apply를 쓰고 있는 TextView이기 때문에 this로 IntentOne_06 클래스를 가리키기 위해서는 @IntentOne_06이 필요하다.
}
}
• 결과
5. 명시적 인텐트 - 간단한 데이터 전달
• activity_intent_one06.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".IntentOne_06">
<TextView
android:id="@+id/implicitIntent"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FFFF00"
android:gravity="center"
android:text="암시적 인텐트" />
<TextView
android:id="@+id/implicitIntentWithData"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FF00"
android:gravity="center"
android:text="암시적 인텐트 - 데이터 전달" />
<TextView
android:id="@+id/explicitIntentComponentName"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FFFF"
android:gravity="center"
android:text="명시적 인텐트 - ComponentName 방식" />
<TextView
android:id="@+id/explicitIntentContext"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FF00FF"
android:gravity="center"
android:text="명시적 인텐트 - Context 방식" />
<TextView
android:id="@+id/explicitIntentWithSimpleData"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#BBBBBB"
android:gravity="center"
android:text="명시적 인텐트 - 간단한 데이터 전달" />
</androidx.appcompat.widget.LinearLayoutCompat>
• IntentOne_06.kt
- 요청 하는 쪽
- putExtra() 함수 사용.
- key, value 형식으로 데이터 전달.
package com.example.fastcampus
import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
class IntentOne_06 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent_one06)
// 암시적 인텐트
val implicitIntent: TextView = findViewById(R.id.implicitIntent)
implicitIntent.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL)
startActivity(intent)
}
// 암시적 인텐트 - 데이터 전달
val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
implicitIntentWithData.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111"))
startActivity(intent)
}
// 명시적 인텐트 - ComponentName 방식
val explicitIntent1: TextView = findViewById(R.id.explicitIntentComponentName)
explicitIntent1.setOnClickListener {
val intent: Intent = Intent()
val componentName: ComponentName = ComponentName(
"com.example.fastcampus",
"com.example.fastcampus.IntentTwo_06"
)
intent.component = componentName
startActivity(intent)
}
// 명시적 인텐트 - Context 방식
// val explicitIntent2: TextView = findViewById(R.id.explicitIntentContext)
// explicitIntent2.setOnClickListener {
// val intent: Intent = Intent(this, IntentTwo_06::class.java)
// startActivity(intent)
// }
// View 변수 생성 생략
(findViewById<TextView>(R.id.explicitIntentContext)).apply {
this.setOnClickListener {
startActivity(Intent(this@IntentOne_06, IntentTwo_06::class.java))
}
}
// 명시적 인텐트 - 간단한 데이터 전달
findViewById<TextView>(R.id.explicitIntentWithSimpleData).setOnClickListener {
val intent = Intent(this, IntentTwo_06::class.java)
intent.putExtra("simple-data", "String Data") // putExtra 함수 사용 : key, value 형식으로 데이터 전달.
startActivity(intent)
}
}
}
• IntentTwo_06.kt
- 요청 받는 쪽
- 전달받은 Intent 객체를 intent 키워드로 받을 수 있다.
-> 즉, 다른 요청을 받을 때 마다 intent에 담기는 것이 바뀐다.
- intent.extras?.getString(key) 형식으로 데이터를 받을 수 있다.
- 데이터를 보낼 수도 안 보낼 수도 있기 때문에 extras는 nullable 이다.
- 요청하는 쪽에서 보낸 데이터의 타입에 따라 getString, getInt 등 메소드가 달라진다.
package com.example.fastcampus
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
class IntentTwo_06 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent_two06)
// 명시적 인텐트 - 간단한 데이터 전달
val intent = intent // 이 액티비티를 호출한 인텐트가 들어감.
val data: String? = intent.extras?.getString("simple-data") // data가 있을 수도 없을 수도 있으니 nullable이다.
if(data!=null) {
Log.d("dataa", data) // String Data 출력
}
}
}
• 결과
6. 명시적 인텐트 - 결과 받기 (startActivityForResult 사용)
• deprecated 됨.
- 하지만 옛날부터 사용하던 함수라 사용법은 알아야 다른 사람의 코드를 이해할 수 있다.
• activity_intent_one06.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".IntentOne_06">
<TextView
android:id="@+id/implicitIntent"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FFFF00"
android:gravity="center"
android:text="암시적 인텐트" />
<TextView
android:id="@+id/implicitIntentWithData"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FF00"
android:gravity="center"
android:text="암시적 인텐트 - 데이터 전달" />
<TextView
android:id="@+id/explicitIntentComponentName"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FFFF"
android:gravity="center"
android:text="명시적 인텐트 - ComponentName 방식" />
<TextView
android:id="@+id/explicitIntentContext"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FF00FF"
android:gravity="center"
android:text="명시적 인텐트 - Context 방식" />
<TextView
android:id="@+id/explicitIntentWithSimpleData"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#BBBBBB"
android:gravity="center"
android:text="명시적 인텐트 - 간단한 데이터 전달" />
<TextView
android:id="@+id/explicitIntentWithResult"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#AAAAFF"
android:gravity="center"
android:text="명시적 인텐트 - 결과 받기(startActivityForResult)" />
</androidx.appcompat.widget.LinearLayoutCompat>
• IntentOne_06.kt
- 요청 하는 쪽
- startActivityForResult(intent, requestCode)로 요청.
- requestCode : 어떤 요청에 대한 결과 값인지 구분하기 위한 코드
ex) activityOne <-> activityTwo (requestCode 1)
activityOne <-> activityThree (requestCode 2)
- onActivityResult(requestCode, resultCode, data) 메소드를 오버라이드하여 요청에 대한 결과를 받을 수 있다.
- resultCode : 성공, 실패 등의 상태를 알 수 있음.
ex) RESULT_OK, RESULT_CANCEL
package com.example.fastcampus
import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
class IntentOne_06 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent_one06)
// 암시적 인텐트
val implicitIntent: TextView = findViewById(R.id.implicitIntent)
implicitIntent.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL)
startActivity(intent)
}
// 암시적 인텐트 - 데이터 전달
val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
implicitIntentWithData.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111"))
startActivity(intent)
}
// 명시적 인텐트 - ComponentName 방식
val explicitIntent1: TextView = findViewById(R.id.explicitIntentComponentName)
explicitIntent1.setOnClickListener {
val intent: Intent = Intent()
val componentName: ComponentName = ComponentName(
"com.example.fastcampus",
"com.example.fastcampus.IntentTwo_06"
)
intent.component = componentName
startActivity(intent)
}
// 명시적 인텐트 - Context 방식
// val explicitIntent2: TextView = findViewById(R.id.explicitIntentContext)
// explicitIntent2.setOnClickListener {
// val intent: Intent = Intent(this, IntentTwo_06::class.java)
// startActivity(intent)
// }
// View 변수 생성 생략
(findViewById<TextView>(R.id.explicitIntentContext)).apply {
this.setOnClickListener {
startActivity(Intent(this@IntentOne_06, IntentTwo_06::class.java))
}
}
// 명시적 인텐트 - 간단한 데이터 전달
findViewById<TextView>(R.id.explicitIntentWithSimpleData).setOnClickListener {
val intent = Intent(this, IntentTwo_06::class.java)
intent.putExtra("simple-data", "String Data")
startActivity(intent)
}
// 명시적 인텐트 - 결과 받기(startActivityForResult)
findViewById<TextView>(R.id.explicitIntentWithResult).setOnClickListener {
val intent = Intent(this@IntentOne_06, IntentTwo_06::class.java)
startActivityForResult(intent, 1)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) { // requestCode로 어떤 요청에 대한 결과 값인지 구분할 수 있다.
1 -> {
when (resultCode) { // resultCode로 요청 성공, 실패 등을 알 수 있다.
RESULT_OK -> {
val dataString: String? = data?.extras?.getString("result")
Log.d("dataa", dataString!!) // 받은 결과 값 출력
}
}
}
}
}
}
• IntentTwo_06.kt
- 요청 받는 쪽
- setResult(resultCode, intent)로 결과 돌려줌.
- finish()로 액티비티를 끝내면 요청하는 쪽에서 결과를 받음.
package com.example.fastcampus
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.content.Intent
import android.util.Log
import android.widget.TextView
class IntentTwo_06 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent_two06)
// 명시적 인텐트 - 간단한 데이터 전달
val intent = intent
val data: String? = intent.extras?.getString("simple-data")
if(data!=null) {
Log.d("dataa", data)
}
// 명시적 인텐트 - 결과 받기
findViewById<TextView>(R.id.text1).setOnClickListener {
val intent: Intent = Intent()
intent.putExtra("result", "success")
setResult(RESULT_OK, intent) // setResult 함수 사용 : 요청 결과 보냄.
finish() // finish 함수 사용 : 액티비티 종료
}
}
}
• 결과
7. 명시적 인텐트 - 결과 받기 (ActivityResultLauncher 사용)
• activity_intent_one06.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".IntentOne_06">
<TextView
android:id="@+id/implicitIntent"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FFFF00"
android:gravity="center"
android:text="암시적 인텐트" />
<TextView
android:id="@+id/implicitIntentWithData"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FF00"
android:gravity="center"
android:text="암시적 인텐트 - 데이터 전달" />
<TextView
android:id="@+id/explicitIntentComponentName"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FFFF"
android:gravity="center"
android:text="명시적 인텐트 - ComponentName 방식" />
<TextView
android:id="@+id/explicitIntentContext"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FF00FF"
android:gravity="center"
android:text="명시적 인텐트 - Context 방식" />
<TextView
android:id="@+id/explicitIntentWithSimpleData"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#BBBBBB"
android:gravity="center"
android:text="명시적 인텐트 - 간단한 데이터 전달" />
<TextView
android:id="@+id/explicitIntentWithResult"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#AAAAFF"
android:gravity="center"
android:text="명시적 인텐트 - 결과 받기(startActivityForResult)" />
<TextView
android:id="@+id/explicitIntentWithResult2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FFAAAA"
android:gravity="center"
android:text="명시적 인텐트 - 결과 받기(ActivityResultLauncher)" />
</androidx.appcompat.widget.LinearLayoutCompat>
• IntentOne_06.kt
- 요청하는 쪽
- ActivityResultLauncher를 생성하고, 이를 사용한다.
- requestCode 없이도 어떤 요청에 대한 결과인지 구분할 수 있다.
- startActivityForResult 방법은 모든 인텐트 결과를 onActivityResult 메소드 하나로 받았기 때문에 requestCode로 인텐트 구분이 필요하다.
- ActivityResultLauncher 방법은 각 요청마다 다른 ActivityResultLauncher를 생성하여 사용하기 때문에 requestCode가 필요없다.
package com.example.fastcampus
import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
class IntentOne_06 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent_one06)
// 암시적 인텐트
val implicitIntent: TextView = findViewById(R.id.implicitIntent)
implicitIntent.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL)
startActivity(intent)
}
// 암시적 인텐트 - 데이터 전달
val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
implicitIntentWithData.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111"))
startActivity(intent)
}
// 명시적 인텐트 - ComponentName 방식
val explicitIntent1: TextView = findViewById(R.id.explicitIntentComponentName)
explicitIntent1.setOnClickListener {
val intent: Intent = Intent()
val componentName: ComponentName = ComponentName(
"com.example.fastcampus",
"com.example.fastcampus.IntentTwo_06"
)
intent.component = componentName
startActivity(intent)
}
// 명시적 인텐트 - Context 방식
// val explicitIntent2: TextView = findViewById(R.id.explicitIntentContext)
// explicitIntent2.setOnClickListener {
// val intent: Intent = Intent(this, IntentTwo_06::class.java)
// startActivity(intent)
// }
// View 변수 생성 생략
(findViewById<TextView>(R.id.explicitIntentContext)).apply {
this.setOnClickListener {
startActivity(Intent(this@IntentOne_06, IntentTwo_06::class.java))
}
}
// 명시적 인텐트 - 간단한 데이터 전달
findViewById<TextView>(R.id.explicitIntentWithSimpleData).setOnClickListener {
val intent = Intent(this, IntentTwo_06::class.java)
intent.putExtra("simple-data", "String Data")
startActivity(intent)
}
// 명시적 인텐트 - 결과 받기(startActivityForResult)
findViewById<TextView>(R.id.explicitIntentWithResult).setOnClickListener {
val intent = Intent(this@IntentOne_06, IntentTwo_06::class.java)
startActivityForResult(intent, 1)
}
// 명시적 인텐트 - 결과 받기(ActivityResultLauncher)
val startActivityLauncher: ActivityResultLauncher<Intent> = registerForActivityResult( // ActivityResultLauncher 생성
ActivityResultContracts.StartActivityForResult()
) { // 이 블록에서 해당 요청의 결과 값을 바로 받는다. -> requestCode가 필요없다.
when(it.resultCode) {
RESULT_OK -> {
Log.d("dataa", it.data?.extras?.getString("result")!!)
}
}
}
findViewById<TextView>(R.id.explicitIntentWithResult2).setOnClickListener {
val intent = Intent(this@IntentOne_06, IntentTwo_06::class.java)
startActivityLauncher.launch(intent) // 생성한 ActivityResultLauncher의 launch 메소드로 intent 전달
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
1 -> {
when (resultCode) {
RESULT_OK -> {
val dataString: String? = data?.extras?.getString("result")
Log.d("dataa", dataString!!)
}
}
}
}
}
}
• 결과
8. 명시적 인텐트 - 이미지 데이터 전달
• 사용 빈도가 높거나 한 기능은 아니다.
• 인텐트 시 데이터를 전달할 때 key-value 형식의 데이터도 되고, 다른 타입의 데이터도 된다 정도만 알면 된다.
• activity_intent_one06.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".IntentOne_06">
<TextView
android:id="@+id/implicitIntent"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FFFF00"
android:gravity="center"
android:text="암시적 인텐트" />
<TextView
android:id="@+id/implicitIntentWithData"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FF00"
android:gravity="center"
android:text="암시적 인텐트 - 데이터 전달" />
<TextView
android:id="@+id/explicitIntentComponentName"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#00FFFF"
android:gravity="center"
android:text="명시적 인텐트 - ComponentName 방식" />
<TextView
android:id="@+id/explicitIntentContext"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FF00FF"
android:gravity="center"
android:text="명시적 인텐트 - Context 방식" />
<TextView
android:id="@+id/explicitIntentWithSimpleData"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#BBBBBB"
android:gravity="center"
android:text="명시적 인텐트 - 간단한 데이터 전달" />
<TextView
android:id="@+id/explicitIntentWithResult"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#AAAAFF"
android:gravity="center"
android:text="명시적 인텐트 - 결과 받기(startActivityForResult)" />
<TextView
android:id="@+id/explicitIntentWithResult2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#FFAAAA"
android:gravity="center"
android:text="명시적 인텐트 - 결과 받기(ActivityResultLauncher)" />
<TextView
android:id="@+id/explicitIntentWithImageData"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="1dp"
android:background="#AAFFAA"
android:gravity="center"
android:text="명시적 인텐트 - 이미지 데이터 전달" />
</androidx.appcompat.widget.LinearLayoutCompat>
• IntentOne_06.kt
- 요청하는 쪽
package com.example.fastcampus
import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.KeyEventDispatcher.Component
import org.w3c.dom.Text
class IntentOne_06 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent_one06)
// 암시적 인텐트
val implicitIntent: TextView = findViewById(R.id.implicitIntent)
implicitIntent.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL)
startActivity(intent)
}
// 암시적 인텐트 - 데이터 전달
val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
implicitIntentWithData.setOnClickListener {
val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111"))
startActivity(intent)
}
// 명시적 인텐트 - ComponentName 방식
val explicitIntent1: TextView = findViewById(R.id.explicitIntentComponentName)
explicitIntent1.setOnClickListener {
val intent: Intent = Intent()
val componentName: ComponentName = ComponentName(
"com.example.fastcampus",
"com.example.fastcampus.IntentTwo_06"
)
intent.component = componentName
startActivity(intent)
}
// 명시적 인텐트 - Context 방식
// val explicitIntent2: TextView = findViewById(R.id.explicitIntentContext)
// explicitIntent2.setOnClickListener {
// val intent: Intent = Intent(this, IntentTwo_06::class.java)
// startActivity(intent)
// }
// View 변수 생성 생략
(findViewById<TextView>(R.id.explicitIntentContext)).apply {
this.setOnClickListener {
startActivity(Intent(this@IntentOne_06, IntentTwo_06::class.java))
}
}
// 명시적 인텐트 - 간단한 데이터 전달
findViewById<TextView>(R.id.explicitIntentWithSimpleData).setOnClickListener {
val intent = Intent(this, IntentTwo_06::class.java)
intent.putExtra("simple-data", "String Data")
startActivity(intent)
}
// 명시적 인텐트 - 결과 받기(startActivityForResult)
findViewById<TextView>(R.id.explicitIntentWithResult).setOnClickListener {
val intent = Intent(this@IntentOne_06, IntentTwo_06::class.java)
startActivityForResult(intent, 1)
}
// 명시적 인텐트 - 결과 받기(ActivityResultLauncher)
val startActivityLauncher: ActivityResultLauncher<Intent> = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) {
when(it.resultCode) {
RESULT_OK -> {
Log.d("dataa", it.data?.extras?.getString("result")!!)
}
}
}
findViewById<TextView>(R.id.explicitIntentWithResult2).setOnClickListener {
val intent = Intent(this@IntentOne_06, IntentTwo_06::class.java)
startActivityLauncher.launch(intent)
}
// 명시적 인텐트 - 이미지 데이터 전달
findViewById<TextView>(R.id.explicitIntentWithImageData).setOnClickListener {
val intent = Intent(this@IntentOne_06, IntentTwo_06::class.java)
val imageUri = Uri.parse("android.resource://" + packageName + "/drawable/" + "dog") // 전달할 이미지를 URI 방식으로 선언
intent.action = Intent.ACTION_SEND
intent.putExtra(Intent.EXTRA_STREAM, imageUri) // 이미지 전달
intent.setType("image/*") // 모든 타입의 이미지로 타입을 정한다.
startActivity(intent)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
1 -> {
when (resultCode) {
RESULT_OK -> {
val dataString: String? = data?.extras?.getString("result")
Log.d("dataa", dataString!!)
}
}
}
}
}
}
• activity_intent_two06.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".IntentTwo_06">
<TextView
android:id="@+id/text1"
android:layout_width="200dp"
android:layout_height="100dp"
android:background="#00FF00"
android:gravity="center"
android:text="IntentTwo_06 액티비티"/>
<ImageView
android:id="@+id/imageView"
android:layout_width="100dp"
android:layout_height="100dp"
app:layout_constraintTop_toBottomOf="@id/text1" />
</androidx.constraintlayout.widget.ConstraintLayout>
• IntentTwo_06.kt
- 요청 받는 쪽
package com.example.fastcampus
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.content.Intent
import android.net.Uri
import android.os.Parcelable
import android.util.Log
import android.widget.ImageView
import android.widget.TextView
class IntentTwo_06 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent_two06)
// 명시적 인텐트 - 간단한 데이터 전달
val intent = intent
val data: String? = intent.extras?.getString("simple-data")
if(data!=null) {
Log.d("dataa", data)
}
// 명시적 인텐트 - 결과 받기
findViewById<TextView>(R.id.text1).setOnClickListener {
val intent: Intent = Intent()
intent.putExtra("result", "success")
setResult(RESULT_OK, intent)
finish()
}
// 명시적 인텐트 - 이미지 데이터 전달
val imageView = findViewById<ImageView>(R.id.imageView)
val uri = Uri.parse(intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM).toString()) // 전달받은 이미지 uri 저장
imageView.setImageURI(uri) // 이미지 출력
}
}
• 결과
이 글은
패스트 캠퍼스 Android 앱 개발의 정석 with Kotlin 올인원 패키지 Online
강의를 듣고 공부한 내용을 바탕으로 작성되었습니다.
'📱 Android > 💡 개념' 카테고리의 다른 글
[Android/개념] 9. Text Changed Listener (0) | 2022.11.02 |
---|---|
[Android/개념] 8. Activity Stack(액티비티 스택) (0) | 2022.11.01 |
[Android/개념] 6. Context(컨텍스트) (0) | 2022.10.28 |
[Android/개념] 5. 앱 구성 요소(App Component) (0) | 2022.10.27 |
[Android/개념] 4. 뷰 컨트롤(View Control) (0) | 2022.10.24 |