startActivityForResult()가 Deprecated되었다.
위 페이지를 본다면 Deprecated된 이유는
- AndroidX Activity와 Fragment에 도입된 Activity Result API 사용을 적극 권장.
- 결과를 얻는 Activity를 실행하는 로직을 사용할 때, 메모리 부족으로 인해 프로세스와 Activity가 사라질 수 있다. (특히 카메라 같은 메모리를 많이 사용하는 작업은 소멸 확률이 굉장히 높다.)
-> 따라서 Activity Result API는 다른 Activity를 실행하는 코드는 Result Callback 부분과 분리해서 만들어야 한다. Result Callback은 프로세스와 Activity가 다시 생성될 때 사용할 수 있어야 하므로 다른 Activity를 실행하는 로직은 Activity가 생성될 때마다 Callback을 무조건 등록해야 한다. |
고 나와있다.
관련해서 찾다보니
위 글을 보면 카메라를 실행했는데, 안드로이드 시스템이 자신의 앱을 kill 해서 카메라로 찍은 사진의 uri를 받아올 수 없는 상황이라고 한다.
이런 경우 때문에 startActivityResult()와 onActivityResult()가 Deprecated된 것 같다.
(글 쓴게 엄청 옛날이다 보니 아마 이 때는 Deprecated 되기 전인듯 하다.)
정리해 보자면,
원래 startActivityResult메서드를 사용하면 항상 onActivityResult에서 콜백을 처리해야 한다.
두 개가 같은 곳에서 구현을 해야하는데, 메모리가 부족해서 프로세스와 Activity가 사라질 수가 있다.
Activity가 종료되고 다시 만들어 질때, Activity에게 Result를 기다리는 상황이라고 다시 알려주어야 한다.
따라서 Activity를 실행하는 부분과 Result CallBack부분을 분리해서 만들어 주어야 한다.
그 역할을 해주는 것이 ActivityResultLauncher 객체이다.
registerForActivityResult() 메서드는 콜백을 등록하는 역할을 해준다.
Result CallBack 부분을 분리해서 구현하기 때문에 requestCode도 필요가 없다.
ActivityResultLauncher객체와 registerForActivityResult()를 이용하면 Activity가 종료됐다 다시 만들어져도,
Result 값을 기다리고 있다는 것을 알려줄 수 있다.
A 액티비티와 B 액티비티가 있을 때,
startActivityResult메서드와 onActivityResult메서드를 사용해서 구현할 경우
- A -> B 실행, 메모리가 부족해서 A가 소멸됨.
- B 액티비티 종료 후 setResult() 메서드로 결과값 넘김
- A가 소멸됐다가 다시 생성돼서 B에게 결과값을 요청한 줄 모름.
ActivityResultLauncher객체와 registerForActivityResult()를 사용한 경우
- A -> B 실행, 메모리가 부족해서 A가 소멸됨.
- B 액티비티 종료 후 setResult() 메서드로 결과값 넘김
- A가 다시 생성돼도 registerForActivityResult() 메서드가 다시 콜백을 등록해 줘서 결과값을 받아온다.
∴ ActivityResultLauncher객체와 registerForActivityResult()로 구현하면 된다 !
구현방법은 위에 서술했다.
'안드로이드 > 개발 관련' 카테고리의 다른 글
[Kotlin] 안드로이드 데이터 바인딩, 데이터 결합, Data Binding (0) | 2021.10.12 |
---|---|
[Kotlin] 안드로이드 뷰 바인딩, 뷰 결합, View Binding (2) | 2021.09.29 |
[Android] 정리해야 할 개발기술 목록 - 계속 업데이트중 (0) | 2021.08.11 |
[Android][Java] 프래그먼트 뒤로가기 누르면 원상복구 + 프래그먼트 데이터 전달 (0) | 2021.08.01 |
[Kotlin]2020-여름 안드로이드 첫 앱. 알람메모-Alamemo (0) | 2021.07.15 |