Android App Track⛺-019

MunkiJeon·2024년 6월 24일

TIL

목록 보기
36/59

TIL (Today I Learned)

오늘 공부한거!

registerForActivityResult() 깊게 파보기


먼저!! registerForActivityResult()을 찾게 된 이유!
👉 내가 알고 있던건 Intent(출발지 엑티비티, 도착지 엑티비티) 하나 변수에 넣어서,
Intent변수.putExtra(네임텍, 보내줄 데이터)로 싣고,
startActivity(Intent변수) 해서 [단방향]으로 주는거만 알고 있었음

[양방향]으로 주고 받는 걸 찾아보니...

  • 기존에는 액티비티에서 값을 받아올 때 startActivityForResult()onActivityResult()를 사용했지만 deprecated(더 이상 사용되지 않음) 되었다...
    라는데 과거는 됬고 현재는 뭘쓰냐!?

👉registerForActivityResult()요놈을 쓴다!!??

  • 특징 : MainActivity <-> SecondActivity 쌍방향으로 데이터 전달 가능

registerForActivityResult() 요놈 우예씀? (사용법 + 분석)

참고: registerForActivityResult() 사용하기

1. Activity Result에 콜백 등록(MainActivity.kt)

 val startForResult = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result: ActivityResult ->
        if (result.resultCode == RESULT_OK) {
            val str = result.data?.getStringExtra("str")!!
            Toast.makeText(context, Main 으로 돌아옴, Toast.LENGTH_SHORT).show()
           
        }
    }
  1. ActivityResultContracts.StartActivityForResult

    ActivityResultContract<I : Any?, O : Any?> : (번역:활동결과계약 - 뭔말인고???)

    • ActivityResultContract<I : Any?, O : Any?> = 유형 I의 입력으로 활동을 호출하고 O 유형의 출력을 생성할 수 있음을 지정하는 계약입니다...
      (말이 어려우니 내 머릿속은 점점 미궁으로...🫠)
      > 내가 이해한 바: 폰에서 시스템 적으로 데이터를 주고 받게 해줌
  2. startActivity : 새 액티비티를 열어줌 (단방향)
    StartActivityForResult : 새 액티비티를 열어줌 + 결과값 전달 (쌍방향)
  3. result: ActivityResult -> : 다른 액티비티에서 보낸 값
  4. result.resultCode == RESULT_OK : 다른 액티비티에서 보낸 응답 값 == RESULT_OK 일때
  5. val str = result.data?.getStringExtra("str")!!Toast.makeText(context, Main 으로 돌아옴, Toast.LENGTH_SHORT).show() :
    다른 액티비티에서 보낸 응답 값.data.String형태의 Extra(데이터) 꺼내와서 Toast만들어 변수 str에다가 넣음

2. 결과를 위한 활동 실행 (MainActivity.kt)

class MainActivity : AppCompatActivity(){
	private lateinit var binding: ActivityMainBinding

	 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater).also {setContentView(it.root)}
        // ActivityMainBinding UI만들어 주는 [activity_main.xml]에 상응하는 레이아웃 만드는 뭐 그런 짜슥?
        
        with(binding){ 
        //버튼하나 만들어서 setOnClickListener 달고
        //버튼 클릭 시 데이터를 받아 올 SecondActivity 를 실행한다
          btnSecond.setOnClickListener { 
          	val intent = Intent(this, SettingPriceActivity::class.java)
           // [Activity Result에 콜백 등록]에서 만든 
           // [startForResult = registerForActivityResult()]를 launch(화면 이동 실행)
        	startForResult.launch(intent)
        }
}

3. 데이터를 보냄 (SecondActivity.kt)

with(binding){
	btnSend.setOnClickListener {
       val intent = Intent(this, MainActivity::class.java).apply {
            putExtra("str","보낼 데이터")
       }
       //응답코드 와 데이터(intent) 싣어 보냄
       setResult(RESULT_OK,intent)
       finish()
   }
}

Today Review

  • registerForActivityResult() 이놈 문서 찾아보고, 인터넷에 떠도는 거 따라 써보고, 몇번 봐도 이해 안갔는데... 깊이 파보니 좀 알것네...후 🙍
profile
공장자동화와 웹 개발을 핥아 먹다 앱 개발로 전향한 개발자의 키보드의 낡은 키캡⛑️

0개의 댓글