토이 프로젝트를 진행하던 중 startActivityForResult를 사용할 일이 생겨 onActivityResult와 함께 오버라이드를 한 결과...
위 사진과 같이 deprecated 되어 더 이상 지원하지 않는다는 것을 알게 되었다.
조금 더 자세히 알아보니 2020년 5월 기준으로 deprecated 되었다고 한다.
사라진 이유는 프로젝트 규모가 커질수록 onActivityResult 메소드 안에 들어가는 코드의 양이 늘어나기 때문이다.
예를 들어, onActivityResult 메소드에서 requestCode에 따라 분기를 나누어 로직을 수행하는데, 그 안에서도 조건에 따라 분기가 나뉘면 클린 코드에서 점점 멀어지게 될 것이다.
이러한 문제를 해결하기 위해서 ActivityResultContracts 개념과 registerForActivityResult() 새로운 메소드가 생겼다.
기존 startActivityForResult와 다르게 분기를 나눌 필요 없이 따로따로 result launcher를 실행할 수 있는 구조이다.
아래는 예시 코드이다.
private lateinit var googleLoginResultLauncher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// start activity result
googleLoginResultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == RESULT_OK) {
val signInTask = GoogleSignIn.getSignedInAccountFromIntent(result.data)
try {
val account = signInTask.getResult(ApiException::class.java)
viewModel.onGoogleSignInAccount(account)
} catch (e: ApiException) {
Timber.e(e.message)
}
}
}
}
// 구글 로그인 화면 출력
private fun signInWithGoogle(googleSignInClient: GoogleSignInClient) {
googleSignInClient.signInIntent.run {
googleLoginResultLauncher.launch(this)
}
}
위 코드는 현재 프로젝트에서 구현 중인 구글 로그인 코드의 일부이다.
구글 로그인을 위해서는 필수적으로 intent를 실행시키는 작업이 필요한데, 그 부분이 맨 아래의 signInWithGoogle() 메서드이다.
이전과 다르게 startActivityForResult를 사용하지 않을뿐더러 Request Code도 필요 없다.
이 Launcher를 launch 시키면, 작업 수행 후에 onCreate() 메서드 아래에 있는 로직이 수행된다.
확실히 Request Code로 분기를 나눌 필요 없이 개별적으로 result 객체를 생성할 수 있기 때문에 한결 클린 하게 코드를 작성할 수 있게 되었다.