[THEC!T] 앱 스쿨2기 : Android

TECHIT 앱 스쿨 2기: Android 36일차 (23.06.19)

끝까지 처음처럼 2023. 6. 20. 00:16
728x90

자료 출처 : 안드로이드 앱스쿨 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`을 주로 사용합니다.

 

 

마무리

지금 까지 배운 내용을 바탕으로 문제와 중간과제를 내주셨습니다.

저의 경우 지금까지 배운내용을 복습을 하긴 하였으나, 손에 익숙하지 않아 바로바로 나오지 않는 문제가 있어 연습이 더 필요한 상황이라 지금까지 알려주신 자료들을 이용하여 작성하고 있습니다. 과제를 끝 마친 후에는 문제들을 천천히 다시 풀어보면서 리사이클러 뷰, 어댑터, 스피너, 메뉴 등등을 다시 연습 할 수 있도록 하겠습니다.

 

오늘의 마음가짐

기초가 부실하면 결국 무너지므로 기초를 튼튼히 하는 사람이 되자.