BuNa_
IT Story
BuNa_
전체 방문자
오늘
어제
  • 분류 전체보기 (117)
    • CS (14)
      • 운영체제 (8)
      • 네트워크 (0)
      • Design Pattern (1)
      • OOP (4)
    • 대외활동 (24)
      • 우아한테크코스 (14)
      • DND 동아리 (4)
      • UMC 동아리 (5)
      • 해커톤 (1)
    • Android (29)
      • MVVM (2)
      • 스터디 (11)
      • Compose (3)
      • Unit Test (1)
    • Project (5)
      • 어따세워 (5)
      • DnD 과외 서비스 (0)
    • Programming (11)
      • Kotlin (4)
      • 파이썬 (7)
    • Git (1)
    • 인공지능 (22)
    • 백준 (8)
    • 기타 (3)
      • IntelliJ (1)
      • 일상 (0)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 원시값 포장
  • UMC
  • ViewModel
  • 딥러닝
  • Ai
  • External fragmentation
  • MVVM
  • 우테코
  • 우테코 프리코스
  • 어따세워
  • 우테코 5기
  • 선형회귀
  • 외부 단편화
  • 안드로이드
  • RecyclerView
  • 객체지향 생활체조
  • K-means
  • Baekjoon
  • 인공지능
  • Android
  • 운영체제
  • 백준
  • 파이썬
  • 다이나믹 프로그래밍
  • 셀레니움
  • 우아한테크코스
  • 인공지능 분류
  • 컴공선배
  • Compose
  • k-means++

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
BuNa_

IT Story

[Android] startActivityForResult() depreacted 해결 : ActivityResultContracts
Android/스터디

[Android] startActivityForResult() depreacted 해결 : ActivityResultContracts

2021. 12. 1. 17:13

 

토이 프로젝트를 진행하던 중 startActivityForResult를 사용할 일이 생겨 onActivityResult와 함께 오버라이드를 한 결과...

 

'startActivityForResult is deprecated'

 

위 사진과 같이 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 객체를 생성할 수 있기 때문에 한결 클린 하게 코드를 작성할 수 있게 되었다.

 

저작자표시 비영리 변경금지 (새창열림)

'Android > 스터디' 카테고리의 다른 글

[Android] RecyclerView LayoutPosition vs AdapterPosition 차이를 알아보자!  (0) 2021.12.22
[Android] MVVM ViewModel 오류 : Can't access ViewModels from detached fragment 해결방법!  (4) 2021.12.19
[Android] 카카오맵을 2개 이상 ADD했을 때 발생하는 오류 대처 방법! DaumMap does not support that two or more  (2) 2021.12.17
[Android] OutOfMemoryError: Java heap space 오류 해결 방법  (0) 2021.12.07
[Android] 코루틴 suspendCancellableCoroutine 비동기 처리  (0) 2021.12.02
    'Android/스터디' 카테고리의 다른 글
    • [Android] MVVM ViewModel 오류 : Can't access ViewModels from detached fragment 해결방법!
    • [Android] 카카오맵을 2개 이상 ADD했을 때 발생하는 오류 대처 방법! DaumMap does not support that two or more
    • [Android] OutOfMemoryError: Java heap space 오류 해결 방법
    • [Android] 코루틴 suspendCancellableCoroutine 비동기 처리
    BuNa_
    BuNa_
    안드로이드 개발자를 향해 달리고 있는 공대생입니다! 🧑 Android, Kotlin, Java, Python 등 학습하고 있는 내용과 프로젝트를 주로 업로드하고 있습니다. 지적과 조언은 언제나 환영입니다!😊 github : https://github.com/tmdgh1592

    티스토리툴바