-
TECHIT 앱 스쿨 2기: Android 36일차 (23.06.19)[THEC!T] 앱 스쿨2기 : Android 2023. 6. 20. 00:16728x90
자료 출처 : 안드로이드 앱스쿨 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`을 주로 사용합니다.마무리
지금 까지 배운 내용을 바탕으로 문제와 중간과제를 내주셨습니다.
저의 경우 지금까지 배운내용을 복습을 하긴 하였으나, 손에 익숙하지 않아 바로바로 나오지 않는 문제가 있어 연습이 더 필요한 상황이라 지금까지 알려주신 자료들을 이용하여 작성하고 있습니다. 과제를 끝 마친 후에는 문제들을 천천히 다시 풀어보면서 리사이클러 뷰, 어댑터, 스피너, 메뉴 등등을 다시 연습 할 수 있도록 하겠습니다.
오늘의 마음가짐
기초가 부실하면 결국 무너지므로 기초를 튼튼히 하는 사람이 되자.
'[THEC!T] 앱 스쿨2기 : Android' 카테고리의 다른 글
TECHIT 앱 스쿨 2기: Android 40일차 (23.06.23) (0) 2023.06.24 TECHIT 앱 스쿨 2기: Android 37~39일차 (23.06.20 ~ 22) (0) 2023.06.22 TECHIT 앱 스쿨 2기: Android 34일차 (23.06.15) (0) 2023.06.16 TECHIT 앱 스쿨 2기: Android 33일차 (23.06.14) (0) 2023.06.15 TECHIT 앱 스쿨 2기: Android 32일차 (23.06.13) (1) 2023.06.14