Activity Result API : startActivityForResult() deprecated.

LEE JAESOL·2025년 4월 7일
post-thumbnail

startActivityForResult()는 Android API 30 (Android 11)부터 deprecated 되었다.
대신 Activity Result API 를 사용하는 것이 권장된다.
훨씬 더 깔끔하고 수명 주기에 안전하게 작동한다.



기존의 코드 (deprecated)

btnGallery.apply {
            val getImageFromAlbum: Intent = Intent().apply {
                action = Intent.ACTION_PICK
                type = MediaStore.Images.Media.CONTENT_TYPE // 또는 type = "image/*"
            }

            setOnClickListener {
                try {
                    startActivityForResult(getImageFromAlbum, REQUEST_PHOTO)
                } catch (e: ActivityNotFoundException){ }
            }
        }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == REQUEST_PHOTO && data != null) {
            val selectedUri: Uri = data.data ?: return
            try {
                // 결과 처리
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }

갤러리 인텐트 실행후 onActivityResult에서 결과를 처리하는 기존의 방식이다.



Activity Result API 사용 코드

private lateinit var galleryLauncher: ActivityResultLauncher<Intent>

ActivityResultLauncher를 선언한다.

galleryLauncher = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()
) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val imageUri: Uri? = result.data?.data

        imageUri?.let {
            // 결과 처리
        }
    }
}

onCreate()에서 launcher를 초기화 한다. 여기서 결과 처리 로직을 작성한다.


btnGallery.setOnClickListener {
    val intent = Intent(Intent.ACTION_PICK).apply {
        type = "image/*"
    }
    try {
        galleryLauncher.launch(intent)
    } catch (e: ActivityNotFoundException) {
        Toast.makeText(this, "갤러리 앱을 찾을 수 없습니다.", Toast.LENGTH_SHORT).show()
    }
}

리스너에서는 갤러리 인텐트를 launcher를 통해 실행한다.

profile
개발일지

0개의 댓글