ActivityResultLauncher

박재원·2024년 1월 22일
0

TIL

목록 보기
34/50
post-thumbnail

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()
    ){

        // SubOne에서 결과를 받아옴
        if(it.resultCode == ONE){
            val intent = it.data
            val returnValue = intent!!.getStringExtra("one")
            Toast.makeText(this, returnValue.toString(), Toast.LENGTH_SHORT).show()
        }

        // SubTwo에서 결과를 받아옴
        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.

// 카메라 권한 요청 - 1
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)
    }
}
// 카메라 권한 요청 - 2
perButton.setOnClickListener {
    permissionLauncher.launch(Manifest.permission.CAMERA)
}

0개의 댓글