안드로이드/개발 관련

[Android] startActivityForResult Deprecated된 이유와 해결책

kimyunseok 2021. 7. 28. 23:28

startActivityForResult()가 Deprecated되었다.

 

활동에서 결과 가져오기  |  Android 개발자  |  Android Developers

개발자 앱 내의 활동이든 다른 앱의 활동이든 다른 활동을 시작하는 것이 단방향 작업일 필요는 없습니다. 다른 활동을 시작하고 다시 결과를 받을 수도 있습니다. 예를 들어, 앱에서 카메라 앱

developer.android.com

위 페이지를 본다면 Deprecated된 이유는

  1. AndroidX Activity Fragment에 도입된 Activity Result API 사용을 적극 권장.
  2. 결과를 얻는 Activity를 실행하는 로직을 사용할 때, 메모리 부족으로 인해 프로세스와 Activity가 사라질 수 있다. (특히 카메라 같은 메모리를 많이 사용하는 작업은 소멸 확률이 굉장히 높다.)
-> 따라서 Activity Result API는 다른 Activity를 실행하는 코드는 Result Callback 부분과 분리해서 만들어야 한다.
Result Callback은 프로세스와 Activity가 다시 생성될 때 사용할 수 있어야 하므로 다른 Activity를 실행하는 로직은 Activity가 생성될 때마다 Callback을 무조건 등록해야 한다.

고 나와있다.

 

관련해서 찾다보니

 

startActivityForResult() in low memory situations

I'm developing a phonegap application that uses the camera. In low memory situations, when the camera is launched, my application is killed by the system, sometimes without calling onDestroy() meth...

stackoverflow.com

위 글을 보면 카메라를 실행했는데, 안드로이드 시스템이 자신의 앱을 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메서드를 사용해서 구현할 경우

  1. A -> B 실행, 메모리가 부족해서 A가 소멸됨.
  2. B 액티비티 종료 후 setResult() 메서드로 결과값 넘김
  3. A가 소멸됐다가 다시 생성돼서 B에게 결과값을 요청한 줄 모름.

ActivityResultLauncher객체와 registerForActivityResult()를 사용한 경우

  1. A -> B 실행, 메모리가 부족해서 A가 소멸됨.
  2. B 액티비티 종료 후 setResult() 메서드로 결과값 넘김
  3. A가 다시 생성돼도 registerForActivityResult() 메서드가 다시 콜백을 등록해 줘서 결과값을 받아온다.

 

 

∴ ActivityResultLauncher객체와 registerForActivityResult()로 구현하면 된다 !

 

[Android] 화면 여러개 만들어서 화면 전환하기 - startActivityForResult Deprecated. registerForActivityResult 사

화면 전환은 액티비티를 전환하는 것으로 이루어진다. (물론 요즘은 프래그먼트를 이용해서 많이 전환한다.) 그렇다고 액티비티만 안다고 안드로이드 앱을 잘 구성할 수 있는 것은 아니다. 안드

kimyunseok.tistory.com

구현방법은 위에 서술했다.