[Android] Activity Result API

kldaji·2021년 9월 10일
0

서론

이번 포스팅에서는 외부 활동으로부터 결과를 가져오는 여러가지 기능 중 갤러리에서 사진을 가져오는 기능에 대해 알아보자.
필자는 해당 기능을 구현하기 위해 안드로이드 공식 문서에 있는 Activity Result API 를 사용할 예정이다. Activity Result APIAndroidX ActivityFragment 에 사용하는 것을 적극 권장한다고 했고, 현재 시점을 기준으로 생각해보면 AndroidX 의 사용은 거의 모든 경우에 사용된다고 필자는 생각하기 때문에 Activity Result API 에 익숙해지는 것을 추천한다. (필자는 AndroidX 에 대해 잘 몰라서 해당 내용도 따로 포스팅 할 계획이다.)

본론

Activity Result API 는 외부 활동에 무언가를 요청하고 요청한 것에 대한 결과를 받는 양방향 작업이다. 그렇기 때문에 요청을 보낼 대상을 선정하고, 요청에 대한 결과를 받기 위한 콜백 함수를 등록하는 과정이 필요하다. 여기서 중요한 포인트는 요청하는 코드의 위치와 콜백함수를 분리해야 하는데 이는 외부 활동을 시작할 때 메모리 부족으로 인해 프로세스나 활동이 소멸될 수 있기 때문이다. (필자도 아직 큰 프로젝트를 진행해본 경험이 없기 때문에 메모리 부족에 대한 이슈는 추후에 천천히 알아가보자.)
우선 결과를 받기 위한 콜백 함수를 등록하는 방법에 대해 알아보자.
콜백 함수를 등록하는 방법은 registerForActivityResult() API 를 통해 결과 콜백을 등록할 수 있으며, registerForActivityResult()ActivityResultContractActivityResultCallback 을 가져와서 외부 활동을 실행하는 데 사용할 ActivityResultLauncher 을 반환한다.
아마 여기서 처음보는 영어 단어들이 막 나열되는데, 너무 겁먹지말고 실제 코드와 함께 살펴보자.

private lateinit var launcher: ActivityResultLauncher<Intent>

// ...

launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) 
{ activityResult ->
	// 요청에 대한 콜백                
}

위의 코드는 외부 활동에 요청을 보내기 위한 ActivityResultLauncher 을 생성하는 코드로 registerForActivityResult()ActivityResultContractsActivityResultCallback 을 통해 결과 콜백 함수를 등록한다. 여기서 ActivityResultContracts 는 결과를 생성하기 위해 필요한 입력 유형과 출력 유형을 정의하고, ActivityResultCallback 은 출력 유형의 객체를 가져온다.
registerForActivityResult() 는 단순히 결과 콜백 함수를 등록하는 API 이고, 요청을 보내는 역할은 ActivityResultLauncher 가 담당한다.
실제 필자가 구현한 코드와 함께 살펴보면 다음과 같다.

binding.photoCreationButton.setOnClickListener {
            val intent = Intent(Intent.ACTION_GET_CONTENT)
            intent.type = "image/*"
            launcher.launch(intent)
        }

위의 코드는 사진을 가져오기 위한 버튼을 클릭했을 때 갤러리로 부터 사진을 가져와달라는 요청을 보내는 코드로 사전에 생성했던 ActivityResultLauncher 객체가 launch 메서드를 실행하여 요청을 보내게 된다.

결론

이번 포스팅에서는 외부 활동에게 요청을 보내고 요청에 대한 결과를 받는 콜백 함수를 등록하는 과정의 흐름에 대해 살펴보았다. 필자는 프로젝트를 진행하면서 공부한 내용을 포스팅하는 경향이 있어 다른 외부 활동에 대한 요청을 하게 되는 기회가 온다면 추가적으로 포스팅 할 계획이 있다. 다음 포스팅에서는 받아온 결과(ActivityResult)를 처리하는 과정에 대해 살펴보자.
오늘도 역시 성장했다.

Reference

Activity Result API

profile
다양한 관점에서 다양한 방법으로 문제 해결을 지향하는 안드로이드 개발자 입니다.

0개의 댓글