https://developer.android.com/training/basics/intents/result
활동에서 결과 가져오기 | Android 개발자 | Android Developers
개발자 앱 내의 활동이든 다른 앱의 활동이든 다른 활동을 시작하는 것이 단방향 작업일 필요는 없습니다. 다른 활동을 시작하고 다시 결과를 받을 수도 있습니다. 예를 들어, 앱에서 카메라 앱
developer.android.com
위 안드로이드 개발자 공식 홈페이지에 상세 설명 참조.
Why
- AndroidX Activity와 Fragment에 도입된 Activity Result API 사용 권장
- Result 를 얻기 위해 Activity 을 시작할 때, 메모리 부족으로 인해 프로세스와 활동이 소멸될 수 있습니다.
What
Activity Result API
다른 Activity 을 실행하는 Code 위치에서 Result Callback 분리
Result Callback 은 Process 와 Actvity 을 다시 생성할 때, 
사용할 수 있어야 하므로 다른 Activity 을 실행하는 로직이 사용자 입력 또는 비즈니스 로직을 기반으로 발생하더라도 
Activity 이 생성될 때마다 Callback 을 무조건 등록해야 함. 
How to use ...
Overview
| 인스턴스 | 메서드 | 사용 용도 | 자세히 | 
| ComponentActivity | ActivityResultContract 및 ActivityResultCallback을 가져와서 다른 활동을 실행하는 데 사용할 ActivityResultLauncher를 반환 | ||
| registerForActivityResult ( ) | Result Callback 등록 | ||
| ActivityResultContract | Result 생성하는데 필요한 입력 유형과 출력 유형을 정의 | - 사진 촬영, 권한 요청 등과 같은 기본 인텐트 작업의 *1 Default Contacts을 제공 ( CaptureVideo, CreasteDocument ... )  - custom constract 정의할 수도 있다.  | 
|
| ActivityResultLauncher | 다른 Activity 을 실행하거나 Result 요청 작업 | ||
| GetContent.launch( I input ) | Result 를 생성하는 프로세스가 시작. | - ActivityResultContract 유형과 일치하느입력을 가져옴 | 
1. Result 을 위한 Activity 실행
val getContent = registerForActivityResult(GetContent()) { uri: Uri? ->
    // Handle the returned Uri
    // 2. Result Callback
}
override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    val selectButton = findViewById<Button>(R.id.select_button)
    selectButton.setOnClickListener {
        // Pass in the mime type you'd like to allow the user to select
        // as the input
        getContent.launch("image/*") // 1. Result 결과를 생성하는 프로세스가 시작.
    }
}
*1 Default Contacts : https://developer.android.com/reference/androidx/activity/result/contract/ActivityResultContracts
ActivityResultContracts | Android 개발자 | Android Developers
ActivityResultContracts public final class ActivityResultContracts extends Object java.lang.Object ↳ androidx.activity.result.contract.ActivityResultContracts A collection of some standard activity call contracts, as provided by android. Summary Ne
developer.android.com
2.별도의 클래스에서 Activity Result 수신
class MyLifecycleObserver(private val registry : ActivityResultRegistry)
        : DefaultLifecycleObserver {
    lateinit var getContent : ActivityResultLauncher<String>
    override fun onCreate(owner: LifecycleOwner) {
        getContent = registry.register("key", owner, GetContent()) { uri ->
            // Handle the returned Uri
        }
    }
    fun selectImage() {
        getContent.launch("image/*")
    }
}
class MyFragment : Fragment() {
    lateinit var observer : MyLifecycleObserver
    override fun onCreate(savedInstanceState: Bundle?) {
        // ...
        observer = MyLifecycleObserver(requireActivity().activityResultRegistry)
        lifecycle.addObserver(observer)
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val selectButton = view.findViewById<Button>(R.id.select_button)
        selectButton.setOnClickListener {
            // Open the activity to select an image
            observer.selectImage()
        }
    }
}'Android' 카테고리의 다른 글
| 안드로이드 스튜디오 버전 넘버링 변경 (0) | 2021.06.04 | 
|---|---|
| M1 Mac Apple Silicon (arm64) Preview 버전 (0) | 2021.05.28 | 
| [AndroidX] Preferences 쓰기, 읽기 (0) | 2021.03.10 |