Android ActivityResult
업데이트:
카테고리: Android
/startActivityForResult → 새로운 액티비티를 띄우고 해당 결과를 받는다.
예시
- 앱에서 카메라 앱을 실행하고 찍은 사진을 받는다.
- 사용자가 연락처를 선택하도록 하고 그 결과로 연락처 세부정보를 수신받는다.
이런 액티비티의 결과를 Activity Result Api
에서 관리한다.
기존의 방식
기존에 새로운 Activity를 호출하여 결과를 받는 방법은
startActivityForResult()
를 호출하고 onActivityResult
로 받는 것이였다.
override fun onCreate() {
// 새로운 액티비티를 동작
startActivityForResult(intent, ResultCode)
}
override fun onActivityResult(responseCode:Int, resultCode:Int) {
when (resultCode) {
// 결과 코드에 따른 수행할 로직 설정
}
}
중지된 이유는 기존의 방식에서는 activity를 실행하는 부분과 콜백받아서 처리하는 로직을 한곳에서 진행하였는데, 이 때 실행되는 앱이 카메라와 같이 메모리를 많이 사용하는 앱이라면 메모리 부족으로 인해 프로세스가 소실될 수 있기 때문이다.
앱이 종료되고 다시 실행된다면 callback을 다시 등록해야하는데 onActivityResult
는 그렇지 않기 때문
새로운 방식
registerForActivityResult()
를 사용하여 중간에 원 액티비티가 메모리 부족으로 인해 종료되었다 다시 재시작되어도 결과리스너를 등록해놓아 결과값을 받는다.
1. 콜백 등록
// 오직 콜백 등록
val getContent = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
액티비티의 결과마다 실행되는 로직이 다르고 싶다면 registerForActivityResult()를 여러번 호출해서 각각에 맞는 로직을 짜준다.
단, registerForActivityResult()를 순서대로 호출해야 정상적으로 동작한다.
2. 액티비티 실행
다른 액티비티가 실행하기 전까지는 위의 registerForActivityResult()
는 결과 요청을 하지 않는다.
override fun onCreate() {
// 실행을 시켜야 한다.
getContent.launch("/image")
}