안드로이드

Android registerForActivityResult

코딩하는후운 2021. 6. 23. 10:45
반응형


startActivityForResult(), onActivityResult() 가 deprecated 되었습니다.

ActivityResult를 받기위한 Callback등록


1. A액티비티에서 할일은 registerForActivityResult함수를 사용해서 Callbak을 등록해주는 것 입니다.
인자로 들어가는 것은 ActivityResultContracts클래스의 Static함수들이다.
Result를 받기 위해서 Activity를 실행하는 StartActivityForResult()함수를 넣어 줍니다.

람다식에는 result로 받아온 값을 어떻게 사용하는지 정의해 주면 됩니다.
result객체를 이용하면, resultCode와 data에 접근할 수 있다.

2. 실행하는 액티비티
private lateinit var getResultText: ActivityResultLauncher<Intent>

getResultText = registerForActivityResult(
  ActivityResultContracts.StartActivityForResult()){ result ->
    if(result.resultCode == RESULT_OK) {
      val mString = result.data?.getStringExtra(STRING_INTENT_KEY)
    }
  }
)

2-1) 위에서 정의한 것은 launch함수로 시작시켜주기만 하면 된다.
btn.setOnClickListener {
  val intent = Intent(this, SecondActivity::class.java)
  getResultText.launch(intent)
}

3. 결과주는 액티비티
기존과 변경된 것 없이, setResult()함수에 인자로 resultCode와 intent데이터를 넣어주기만 하면 됩니다.


4. ActivityResultContracts
위에서는 A와 B액티비티간에 데이터를 주고 받을 때,
ActivityResultContracts클래스의 StartActivityForResult를 사용했었는데,
Activity간에 데이터를 주고 받는 다양한 케이스에 맞추어서 각각 다른 함수들을 사용해 주어야 합니다.

예를들어) 이미지등의 컨텐츠를 선택하고 uri를 받아오고자 한다면, GetContent를 사용해 주어야 한다.

목록

https://developer.android.com/reference/kotlin/androidx/activity/result/contract/ActivityResultContracts

 

5. SenderIntent

ScopeStorage를 적용하다가 recoverableSecurityException때문에 intentSender를 호출해야 했다.

 

호출

val intentSender = recoverableSecurityException.userAction.actionIntent.intentSender
checkFilePermissionLauncher.launch(IntentSenderRequest.Builder(intentSender).build())

 

결과 받기

private val checkFilePermissionLauncher =
        registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
            if(result.resultCode == RESULT_OK){
                
            }
        }

 

 

 

참조 : 

https://developer88.tistory.com/351

https://stackoverflow.com/questions/68346074/how-do-i-use-registerforactivityresult-with-startintentsenderforresult-contract

 

반응형