activity 에서 데이터를 주고 받을 수 있던 startActivityForResult()
가 현재 Deprecated 되어 수정이 불가피해졌다. 더이상 미루지 말고 이를 대체할 수 있는 registerForActivityResult()
를 사용해보자 !
dog 라는 String 값을 GiveActivity에서 TakeActivity로 보낸다고 가정해보자.
// DOG_KEY 라는 key 상수를 선언했다고 가정
setResult(Activity.RESULT_OK, Intent().apply {
putExtra(DOG_KEY, "dog")
})
finish()
데이터를 보내는 activity는 익숙할 것이다! putExtra()
메소드에 데이터를 담는다.
private val resultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
result.data?.getStringExtra(DOG_KEY)?.let { text ->
Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
}
}
}
override fun onCreate() {
super.onCreate()
val intent = Intent(this, GiveActivity::class.java)
resultLauncher.launch(intent)
}
먼저 registerForActivityResult()
메소드를 통해 데이터를 받기 위한 런처, ActivityResultLauncher 를 정의한다. 이 때, registerForActivityResult()
에는 ActivityResultContract
와 ActivityResultCallback
을 파라미터로 넘겨주어야 한다.
우리가 결과를 호출하는 데에 필요한 입력 유형과 결과의 출력 유형을 정의한다.
예를 들어, 위의 코드에서는 다른 activity를 통해 값을 넘겨 받는 것이기 때문에 ActivityResultContracts.StartActivityForResult() 를 넘겨주어야한다.
만약 여러 가지 퍼미션 권한을 얻어 와야 하는 경우에는 ActivityResultContracts.RequestMultiplePermissions()을 선택하는 등, 상황에 따라 굉장히 많은 유형이 존재하므로 알맞은 것을 선택해 넘겨주면 된다.
해당 콜백에서는 ActivityResultContract로 정의한 출력 유형의 객체를 가져와 resultCode를 검증한 뒤, result.data 를 통해 원하는 데이터를 받아온다.
이렇게 ActivityResultLauncher 정의한 후, launch로 GiveActivity를 실행하면 데이터 주고 받기 끝!
작성하는 김에 위에 언급한 권한 얻어오기까지 해보자 🙌🏻
카메라 권한을 받아온다고 가정해보자.
private val cameraPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted) {
startCamera(binding.viewFinder)
} else {
Toast.makeText(this, "권한을 받아오지 못했습니다.", Toast.LENGTH_SHORT).show()
finish()
}
}
override fun onCreate() {
super.onCreate()
initViews()
}
private fun initViews() = with(binding) {
if (ContextCompat.checkSelfPermission(
this@CameraActivity,
Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED
) {
startCamera(viewFinder)
} else {
cameraPermissionLauncher.launch(Manifest.permission.CAMERA)
}
}
ContextCompat.checkSelfPermission()
을 통해 권한이 있는지 체크하고 런처를 실행해주면 끝!
여러 개의 퍼미션을 한번에 받아와야 한다면 ActivityResultContracts.RequestMultiplePermissions()을 넘겨주고 arrayList에 받아오고 싶은 권한들을 담아 체크하면 된다.
이제 더이상 구구절절 PERMISSION_REQUEST_CODE
와 같은 상수들을 따로 설정해주지 않아도 돼서 매우 편하다,,⭐️
ActivityResultLauncher 콜백은 activity가 재생성될 때 무조건 다시 등록되어야 하기 때문에 onCreate()나 onStart()에서 선언해 주어야 한다. (launch는 상관없다!)