ActivityResultLauncher
- 액티비티에서 데이터를 받아오기 위해 사용된다.
- 콜백을 분리하여 항상 콜백을 받을 수 있도록 한다.
- e.g. 현재 실행중인 앱의 activity A에서 갤러리 앱의 activity B로부터 사진을 갖고올 때
ActivityForResult가 Deperated된 이유
- AndroidX Activity와 Fragment에 도입된 ActivityResult API 를 안드로이드 공식문서에서 적극 권장함
- 결과를 얻기위해 액티비티를 시작할 때 메모리 부족으로 프로세스와 액티비티가 소멸될 수 있다.
- 두 메서드가 같은 곳에서 구현을 해야하는데 메모리 부족으로 제대로 동작하지 않을 수 있다.
'ActivityResultLauncher'가 'ActivityForResult'와 다른점
- Activity ResulAPI는 다른 activity를 실행하는 코드에서 결과 콜백을 분리한다.
- RequestCode가 사라졌다.
- Activity가 종료되었다가 다시 만들어져도 Result값을 기다리게 할 수 있다.
activityResultLauncher e.g.
private val activityResultLauncher : ActivityResultLauncher<Intent> = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
){
if(it.resultCode == ONE){
val intent = it.data
val returnValue = intent!!.getStringExtra("one")
Toast.makeText(this, returnValue.toString(), Toast.LENGTH_SHORT).show()
}
else if(it.resultCode == TWO){
val intent = it.data
val returnValue = intent!!.getStringExtra("two")
Toast.makeText(this, returnValue.toString(), Toast.LENGTH_SHORT).show()
}
}
Permission e.g.
perButton.setOnClickListener {
if(ContextCompat.checkSelfPermission(
this@MainActivity,
Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED){
Toast.makeText(this@MainActivity, "이미 권한이 있습니다.", Toast.LENGTH_SHORT).show()
}
else{
permissionLauncher.launch(Manifest.permission.CAMERA)
}
}
perButton.setOnClickListener {
permissionLauncher.launch(Manifest.permission.CAMERA)
}