[Android Deprecated] StartActivityForResult

양현진·2022년 3월 30일
0

Oh My Android

목록 보기
13/22
post-thumbnail

평소 Navigation을 사용해서 Fragment끼리 화면이동을 주로 하다보니 Activity간 이동은 최근들어 경험이 없었다. 회사에서 만들어놓은 aar파일이 있어 적용을 했는데 그 중 하나가 다른 Activity를 열고 Result값을 받아오는 코드가 있었고, 그에 적합한 것이 바로 startActivityForResult다. 하지만 그림과 같이, 시원하게 작대기가 그어져 있어 새로나온 ActivityResultLauncher를 알아보려 한다.

항상 Deprecated가 된 API들이 있으면 구글이 의도가 있을테니 이유를 찾아보는 습관이 있다. 우선 개발자 문서가 있고, 내용을 훑어보면
경우: 카메라를 실행했는데, 안드로이드 시스템이 자신의 앱을 kill 해서 카메라로 찍은 사진의 uri를 받아올 수 없는 상황이라고 한다. A Activity에서 B Activity를 실행시키는 도중 메모리가 넘쳐나게 되면 OS가 해당 프로세서를 죽이는 현상때문에 발생한 문제라고 유추해볼 수 있다.

즉 카메라 Activity를 실행시키고 반환값을 주려하는데 전 Activity가 없어져있는 상황. 이를 해결하기 위해 Activity가 종료되고 다시 만들어 질때, Activity에게 Result를 기다리는 상황이라고 다시 알려주어야 한다. 이것을 콜백으로 처리하는것이 이번 주제인 ActivityResultLauncher이다.

해당 Activity가 소멸되도 이벤트를 받아올 수 있는 이유가 리스너를 regist해놓으면 unregist할 때 까지 이벤트가 발생하는 것처럼 이와 비슷한 맥락인듯 한데, 분명 소멸 후 재생성이 되면 리스너가 2개가 되어 이벤트가 중복이 될텐데 이건 코드를 뜯어봐야 알 듯하다. 아무튼 구글이 알아서 중복부분은 처리했지 않았나 싶다.

  • 구현방법
private lateinit var getResult: ActivityResultLauncher<Intent>

override fun onCreate() {
        getResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            if (it.resultCode == RESULT_OK) {
                Log.d(TAG, "onCreate: ${it.data}")
                it.data?.getStringExtra("gd")
            }
        }
        binding.btn.setOnClickListener {
        getResult.launch(Intent(Intent.ACTION_OPEN_DOCUMENT))
        }        
    }

기존의 requestCode가 사라진것을 볼 수 있고, 이 외에 코드는 기존 startActivityForReult의 코드와 동일하다.

주의점이 있는데 공식 문서엔 onCreate이후에 등록을 하라는 것처럼 나와있어 onResume에 등록을 해봤는데 에러가 났다. onStart나 onCreate에 등록을 해야 정상 작동한다.


profile
Android Developer

0개의 댓글

관련 채용 정보