본문 바로가기
Android/Features

[Android] registerForActivityResult

by startSW 2023. 10. 14.

 

안드로이드 앱을 개발하다보면 다른 Activity나 Intent를 시작하고 그 결과를 처리해야 하는 경우가 많이 있습니다.

이때 registerForActivityResult를 사용하면 간결한 코드로 결과 처리를 할 수 있습니다.

이 글에서 registerForActivityResult를 사용하여 다른 Activity의 결과를 처리하는 방법을 설명합니다.

 

기존에(Android 10 이하) 아래와 같이 startActivityForResult 기능을 이용할 수 있었는데요.

// Launch the activity
val intent = Intent(this, MyActivity::class.java)
startActivityForResult(intent, REQUEST_CODE)

// Handle the result
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            // Handle the result here
        }
    }
}

startActivityForResult는 Android 10 (API 레벨 29) 이하에서 주로 사용되었던 방법입니다.

Android 11 (API 레벨 30) 이상에서는 이 방법이 Deprecated 되었습니다..

 

1. ActivityResultLauncher 설정

ActivityResultLauncher를 설정하여 결과를 처리할 준비를 합니다.

ActivityResultLauncher는 registerForActivityResult를 통해 초기화됩니다.

예를 들어, 이미지를 선택하는 경우를 생각해보겠습니다.

val imagePickerLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data: Intent? = result.data
        // 이미지를 처리하는 코드를 여기에 추가
    }
}

위 코드에서 ActivityResultContracts.StartActivityForResult는 새로운 Activity를 시작하고 해당 결과를 받기 위한 컨트랙트를 나타냅니다.

 

2. 다른 Activity 시작

이제 다른 Activity를 시작하려면 ActivityResultLauncher를 사용합니다.

예를 들어, 이미지를 선택하는 다른 Activity를 시작하는 경우:

val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
imagePickerLauncher.launch(intent)

/*
val intent = Intent(this, MyActivity::class.java)
imagePickerLauncher.launch(intent)
*/

위의 코드에서 imagePickerLauncher를 사용하여 이미지 선택을 위한 다른 Activity를 시작합니다.

 

3. 결과 처리

다른 Activity에서 결과가 반환되면 ActivityResultLauncher의 결과 콜백에서 결과를 처리할 수 있습니다.

위의 코드에서는 이미지를 선택한 후 해당 이미지를 처리할 수 있습니다.

 

4. 기타

위 설명에 추가적으로 Media와 관련된 기능을 제대로 사용하기 위해서는 READ_EXTERNAL_STORAGE과 같은 필요한 권한 및 설정을 추가해야 합니다.