본문 바로가기

TIL

[TIL] registerForActivityResult 로 Activity간의 데이터 옮기기

[오늘 배운 내용]

-1- RegisterForActivityResult 로 Acitivity간의 데이터 이동

  • RegisterForActivityResult란?
    • Android studio Activity Result API에서 제공되는 기능으로 AndroidX Activitiy 1.3.0 이상에서 사용할 수 있다.
    • Activity 또는 Fragment와 같은 컴포넌트에서 다른 Activity또는 Fragment등의 컴포넌트와 상호작용을 처리하는데에 사용되는 기능이다.
    • ActivityResultContract 와 AcitivityResultCallBack을 매개변수로 받고 다른 Activity를 실행하는데 사용할 ActivityResultLauncher를 반환한다.
      • ActivityResultContract
        • Intent나 Permission 등의 액션을 제공하고, 결과를 출력하는 타입(형태)정의.
      • ActivityResultCallback
        • 결과 데이터를 처리하는 콜백 함수.
      • ActivityResultLauncher
        • Contract와 Callback 객체를 등록한 후 launch() 함수로 실행할 수 있다. 이벤트가 발생되면, ActivityResultLauncher에 등록된 Contract 객체가 실행 요청을 처리하여 그 결과를 Callback에 전달해 사후 처리가 되도록 한다. 이때 Contract는 ActivityResultContract를 상속받은 서브 클래스이며, 직접 만들거나, API에서 제공되는 클래스를 이용.
    • RegisterForActivityResult() 생성 예시 코드
val myActivityResult = registerForActivityResult(YourContract()) { result ->
    // 결과 처리 로직
}
    • registerForAcitivity() 소괄호 안에 사용할 Contract 클래스를 넣어주면 된다.
    • 자주 사용되는 대표적인 Contract 클래스는 StartAcitivityForResult, RequestPermission 등이 있다.
      • StratActivityForResult
        • Intent 객체를 받아서 새로운 액티비티를 시작하며, 그 액티비티가 종료되면 그 결과인 AcitivityResult 객체가 반환된다.
        • 생성해둔 registerForActivityResult 객체.launch() 메서드를 사용하여 액티비티를 호출한다.

StrartActivityForResult 사용예시

companion object {
        const val BOOLEAN_INTENT_KEY = "my_boolean_key"
        const val INT_INTENT_KEY = "my_int_key"
    }

private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data: Intent? = result.data?.getStringExtra()
        // RESULT_OK인 경우 결과 데이터 처리
    } else {
        // RESULT가 OK가 아닌 경우 데이터 처리
    }
}

// 결과를 받아올 액티비티 호출
val intent = Intent(this, OtherActivity::class.java)
startForResult.launch(intent)

 

      • RequestPermission
        • RequestPermission은 하나의 permission 문자열을 입력으로 받아서 권한 요청을 실행하며, 사용자가 권한 요청에 응답하면 Boolean값으로 반환된다
        • 생성해둔 registerForActivityResult 객체.launch() 메서드를 사용하여 요청할 권한을 전달하고 그 결과 값을 받아온다.

RequestPermission 사용예시

val requestPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
    if (isGranted) {
        // 권한이 허용된 경우 처리
    } else {
        // 권한이 거부된 경우 처리
    }
}

// 권한 요청
requestPermission.launch(Manifest.permission.CAMERA)

 

 

RegisterForAcitivtyResult.StartActivityForResult 작성 코드

  • 액티비티 B 의 editText에 넣은 데이터를 액티비티A (Main)으로 가져와 각 값이 textView에 표시 되도록 작성

액티비티A.kt

class MainActivity : AppCompatActivity() {
    companion object {
        const val ID_STRING_INTENT_KEY = "id_string_key"
        const val NUM_INT_INTENT_KEY = "num_int_key"
    }

    private val setIdAndNum = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
                if (result.resultCode == Activity.RESULT_OK) {
                    val returnId = result.data?.getStringExtra(ID_STRING_INTENT_KEY)
                    val returnNumber = result.data?.getIntExtra(NUM_INT_INTENT_KEY,0)
                    binding.tvId.text = returnId
                    binding.tvNum.text = returnNumber.toString()
            }
    }

    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)


        binding.mainBtnMoveToSecond.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            setIdAndNum.launch(intent)
        }

    }
}

 

 

액티비티B.kt

class SecondActivity : AppCompatActivity() {
    private lateinit var binding : ActivitySecondBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivitySecondBinding.inflate(layoutInflater)
        setContentView(binding.root)


        binding.secondBtnMoveToMain.setOnClickListener {
            val inputId = binding.editInputId
            val inputNum = binding.editInputNum
            if (inputId.text.isNullOrBlank() || inputNum.text.isNullOrBlank())
            {}else{
                intent.putExtra(MainActivity.ID_STRING_INTENT_KEY,inputId.text.toString())
                intent.putExtra(MainActivity.NUM_INT_INTENT_KEY,inputNum.text.toString().toInt())
                Log.d("TAG", "input num : ${intent.getIntExtra(MainActivity.NUM_INT_INTENT_KEY,0 )}")
                setResult(RESULT_OK,intent)
                finish()
            }
        }
    }
}

 

 

 


 

[오늘 복습한 내용]

1.  ... 생각나는 복습 내용이 없다.

 


[오류,에러 등등]

1. B이 별도로 백그라운드 옵션을 주지 않았는데도 검은색으로 나온다

 

 

해결방법

  • 테마 스타일을 건드렸더니 생긴 문제더라.

변경 전

 

< !-- Material3 적용해주니까 정상적으로 보임.. -->

변경 후


[느낀 점]

1. 앉아있는 시간에 비해서 학습양이 적은 느낌이다. 집중하는 시간을 조금 더 늘려야겠다

 

2. 앉아있으니까 군것질 계속 하게된다.

 

3. 점점 아침에 일어나기 힘들다. 체력을 길러야겠다. 

 


[Reference]

 

// registerForActivity

https://kkangsnote.tistory.com/185

https://developer.android.com/training/basics/intents/result

https://jige.tistory.com/36

// ActivityResultLauncher

https://velog.io/@bonimddal2/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-ActivityResultLauncher%EB%A1%9C-startActivityForResult%EC%99%80-requestPermissions-%EB%8C%80%EC%B2%B4%ED%95%98%EA%B8%B0