TECHIT 앱 스쿨 2기: Android 36일차 (23.06.19)
자료 출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 내용
오늘은 startActivityForResult 에 대한 설명으로 시작하셨습니다
startActivityForResult()
안드로이드 애플리케이션에서 다른 액티비티를 시작하고 그 결과를 받기 위해 사용되는 메서드입니다.
startActivityForResult()를 사용하면 다른 액티비티로부터 데이터를 받아오거나 다른 액티비티의 실행 결과에 따라 작업을 수행할 수 있습니다.
startActivityForResult() 매개변수
Intent : 시작하려는 액티비티를 지정하기 위해 사용되며, 실행하려는 액티비티를 식별하는 정보를 포함하고 있습니다.
requestCode : 액티비티를 시작하는 쪽에서 임의로 지정할 수 있는 정수 값입니다. 해당 값은 추후 onActivityResult() 메서드 에서 결과를 식별할 때 사용합니다. 즉 같은 액티비티에서 여러 액티비티를 실행하였을 때 구분하기 위함입니다.
onActivityResult()
startActivityForResult() 가 종료되면 자동으로 호출 되는 메서드 입니다.
onActivityResult() 매개변수
requestCode : startActivityForResult()를 호출 할 때 지정한 정수 값 입니다.
resultCode : 결과 코드로, 실행된 액티비티에서 설정한 결과를 나타냅니다.
data : 실행된 액티비티에서 반환된 데이터를 포함하는 Intent 객체 입니다. data를 통해서 결과 데이터를 추출 및 필요에 따른 작업을 수행 할 수 있습니다.
간단예제
package com.test.android43_study
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.SystemClock
import android.util.Log
import com.test.android43_study.databinding.ActivityMainBinding
import kotlin.concurrent.thread
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
val COMEBACK = 1
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.run{
button.setOnClickListener {
val intent = Intent(this@MainActivity,MainActivity2::class.java)
intent.putExtra("text","액티비티 1에서 보낸값")
startActivityForResult(intent,COMEBACK)
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when(requestCode){
COMEBACK ->{
activityMainBinding.run{
when(resultCode){
RESULT_OK ->{
if(data != null){
val result = data.getStringExtra("text")
textView.text = result
}
}
}
}
}
}
}
}
package com.test.android43_study
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.SystemClock
import android.util.Log
import com.test.android43_study.databinding.ActivityMain2Binding
import kotlin.concurrent.thread
class MainActivity2 : AppCompatActivity() {
lateinit var activityMain2Binding: ActivityMain2Binding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMain2Binding = ActivityMain2Binding.inflate(layoutInflater)
setContentView(activityMain2Binding.root)
activityMain2Binding.run{
val temp = intent.getStringExtra("text")
textView6.text = "${temp} 전달 잘 받았음."
button2.run{
setOnClickListener {
val resultIntent = Intent()
resultIntent.putExtra("text","액티비티 2에서 보낸 값")
setResult(RESULT_OK, resultIntent)
finish()
}
}
}
}
}
다음으로는 registeForActivityResult 에 대해서 알려주셨습니다.
registerForActivityResult()
안드로이드 Jetpack 라이브러리에서 제공하는 메서드로, 액티비티나 프래그먼트에서 새로운 액티비티를 시작하고 결과를 받기 위해 사용되는 기능입니다. 이 메서드를 사용하여 `ActivityResultLauncher`를 생성하고, 생성된 `ActivityResultLauncher`를 통해 액티비티를 시작하고 결과를 처리할 수 있습니다.
간단예제
package com.test.android43_study2
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import com.test.android43_study2.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
lateinit var activityResultLauncher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.run{
val a1 = ActivityResultContracts.StartActivityForResult()
activityResultLauncher = registerForActivityResult(a1){
if(it.resultCode == RESULT_OK){
val result = it.data?.getStringExtra("text")
activityMainBinding.textView.text = "$result"
}
}
button.run{
setOnClickListener {
val intent = Intent(this@MainActivity, MainActivity2::class.java)
intent.putExtra("text","액티비티 1에서 보낸 값")
activityResultLauncher.launch(intent)
}
}
}
}
}
package com.test.android43_study2
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.test.android43_study2.databinding.ActivityMain2Binding
class MainActivity2 : AppCompatActivity() {
lateinit var activityMain2Binding: ActivityMain2Binding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMain2Binding = ActivityMain2Binding.inflate(layoutInflater)
setContentView(activityMain2Binding.root)
activityMain2Binding.run{
textView2.run {
var check = intent.getStringExtra("text")
if(check != null){
text = check
}
}
button2.run{
setOnClickListener {
val resultIntent = Intent()
resultIntent.putExtra("text", "액티비티2에서 보낸 값")
setResult(RESULT_OK, resultIntent)
finish()
}
}
}
}
}
다음은 Parcelable 에 대해서 알려주셨습니다.
Parcelable
안드로이드에서 객체를 직렬화하고 전송하기 위한 인터페이스입니다. `Parcelable` 인터페이스를 구현하는 클래스는 객체를 바이트 스트림으로 변환하고, 이를 다른 액티비티나 프로세스로 전달할 수 있습니다. 주로 액티비티 간 데이터 전달이나 프로세스 간 통신에 사용됩니다.
`Parcelable`을 구현하기 위해서는 다음의 단계를 따릅니다:
1. `Parcelable` 인터페이스를 구현하는 클래스를 생성합니다.
2. `describeContents()` 메서드를 구현합니다. 이 메서드는 객체에 대한 부가 정보의 유형을 반환합니다. 일반적으로 0을 반환합니다.
3. `writeToParcel()` 메서드를 구현합니다. 이 메서드는 객체의 멤버 변수를 `Parcel` 객체에 기록합니다. 멤버 변수의 타입에 따라 적절한 메서드를 사용하여 값을 쓸 수 있습니다.
4. `CREATOR` 상수를 정의합니다. 이 상수는 `Parcelable.Creator` 인터페이스를 구현하는 객체를 가리킵니다. 주로 `Parcelable.Creator` 인터페이스를 구현하는 내부 클래스를 생성하여 사용합니다. `createFromParcel()` 메서드와 `newArray()` 메서드를 구현해야 합니다.
`Parcelable`을 구현한 클래스는 `Intent`의 `putExtra()` 메서드를 통해 다른 액티비티로 전달할 수 있습니다. 또한 `Intent`를 받는 액티비티에서는 `getParcelableExtra()` 메서드를 사용하여 `Parcelable` 객체를 추출할 수 있습니다.
`Parcelable`은 Java의 `Serializable` 인터페이스와 유사하지만, `Parcelable`은 직렬화 및 역직렬화 과정에서 보다 효율적인 성능을 제공합니다. 따라서 안드로이드에서는 객체 전달을 위해 `Parcelable`을 주로 사용합니다.
마무리
지금 까지 배운 내용을 바탕으로 문제와 중간과제를 내주셨습니다.
저의 경우 지금까지 배운내용을 복습을 하긴 하였으나, 손에 익숙하지 않아 바로바로 나오지 않는 문제가 있어 연습이 더 필요한 상황이라 지금까지 알려주신 자료들을 이용하여 작성하고 있습니다. 과제를 끝 마친 후에는 문제들을 천천히 다시 풀어보면서 리사이클러 뷰, 어댑터, 스피너, 메뉴 등등을 다시 연습 할 수 있도록 하겠습니다.
오늘의 마음가짐
기초가 부실하면 결국 무너지므로 기초를 튼튼히 하는 사람이 되자.