[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개의 댓글