ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TECHIT 앱 스쿨 2기: Android 36일차 (23.06.19)
    [THEC!T] 앱 스쿨2기 : Android 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`을 주로 사용합니다.

     

     

    마무리

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

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

     

    오늘의 마음가짐

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

Designed by Tistory.