업데이트:

카테고리:

/

태그: ,

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")
}