ActivityResultLauncher

devms·2023년 2월 23일

안드로이드에서 사후 처리 여부에 따라 인텐트로 액티비티를 시작하는 방법은 다음 3가지로 나뉜다.

  1. public void startActivity(Intent intent)
  2. public void startActivityResult(Intent intent, int requestCode)
  3. ActivityResultLauncher

startActivity()

  • 사후처리가 필요 없을 때 사용

startActivityForResult()

  • 사후 처리가 필요할 때 사용
  • 인텐트를 발생시켜 액티비티를 실행하는 방법 -> 안드로이드 11버전이 나올 즈음부터 androidx의 ActivityResultLauncher를 사용하라고 권장

ActivityResultLauncher

contact -> ActivityResultLauncher -> launch

Contract

  • ActivityResultLauncher를 이용하려면 먼저 Contract 객체가 필요. Contract는 ActivityResultLauncher로 실행될 요청을 처리하는 역할
    -> ActivityResultLauncher로 인텐트를 발생시켜 액티비티를 실행할 때 실제 인텐트를 발생시키는 역할
    ex) 퍼미션 조정 요청을 할 때는 실제 퍼미션 조정 다이얼로그를 띄우는 역할
  • ActivityResultContract를 상송받은 서브 클래스이며 직접 만들거나 API에서 제공하는 클래스를 이용해도 됨

ActivityResultLauncher

registerForActivityResult() 함수로 만드는 객체이며 함수의 매개변수에 실제 작업자인 Contract 객체와 결과를 처리하는 Callback 객체를 등록해 줌

launch
ActivityResultLauncher의 함수이며 launch 함수를 호출하는 순간 ActivityResultLauncher에 등록된 contract 객체가 실행됨

지금까지 설명한 내용을 바탕으로 실제 인텐트를 발생시켜 액티비티를 실행하고 결과를 처리하는 방법을 살펴보겠습니다.

  • ActivityResultLauncher 생성
val requestLauncher: ActivityResultLauncher<Intent> = registerForActivityResult(
	ActivityResultContracts.StartActivityForResult())	//contract
    {	//Callback
    	val resultData = it.data?.getStringExtra("result")
        binding.mainResultView.text = "result : $resultData"
     }
     ...

ActivityResultLauncher를 이용하려면 먼저 registerForActivityResult() 함수로 ActivityResultLauncher를 객체를 만들어야 함. registerForActivityResult() 함수에는 Contract와 Callback 객체를 등록해야 하며 여기서는 인텐트를 발생시키는 StartActivityForResult 객체를 사용.
이렇게 만든 ActivityResultLauncher 객체를 launch() 함수로 실행

  • ActivityResultLauncher 실행
val intent: Intent = Intent(this, DetailActivity::class.java)
requestLauncher.launch(intent)
profile
삽질은 자산이다

0개의 댓글