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를 사용해 주어야 한다.
목록
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
'안드로이드' 카테고리의 다른 글
targetSdkVersion 30, intent.resolveActivity가 null일 경우 (0) | 2021.07.29 |
---|---|
Android Q - 저장소(Storage) 여유공간 가져오기 (0) | 2021.07.23 |
StorageScope 작업하면서 직면한 문제 (0) | 2021.06.16 |
Android Clean Architecture란? (0) | 2021.05.27 |
SAF(Storage Access Framework) (0) | 2021.05.25 |