Tech & Programming/모바일(Android, Flutter)

Fragment에서 호출한 Activity의 결과 받기(onActivityResult 호출 원리)

소스코드 요리사 2020. 9. 8. 12:50

Fragment 에서 activity 호출 호출된 Activity 종료 작업 결과 DATA 리턴받고 싶을 때가 있습니다.

 

 아래와 같이 하면 리턴을 받을 수 있습니다.


1. Fragment
포함하는 Activity FragmentActivity 상속

2. Fragment onActivityResult 오버라이딩하여 구현

3. Fragment startActivityForResult() 메소드를 호출

4. Fragment 의해 실행된 Activity 에서 setReslut 후에 finish

5. Fragment onActvityResult 실행됨.

 

일단, onActivityResult Fragment 포함하고 있는 Activity 부터 먼저 호출됩니다.

그리고, 아래 로직에 따라 Fragment 전달됩니다.

 

아래는 FragmentActivity onActivityResult 입니다.

Fragment 에서 startActivityForResult 하면 Fragment 가지고 있는 onActivityResult requestCode 0xffff(65535) 이상으로 전달됩니다.

 

그래서, >> 16 연산을 했을 0 아니면 Fragment 에서 startActivityForResult 것으로 판단하고, Fragment DATA 전달하기 위해서 findFragmentByWho Fragment 검색 Fragment onActivityResult 호출합니다.

 

호출한 Fragment 없을 경우는 바로 return 됩니다.

 

쉬프트연산(>>) 16 연산을 했을 0 경우는 0xffff 보다 작은 경우로 Activity 에서 startActivityForResult 호출 것으로 판단하고 일반적인 경우 형태로 실행하기 위해서 super.onActivityResult 호출합니다.

 

그리고, Fragment 포함하는 Activity 에서 onActivityResult 오버라이딩 하는 경우에는 super.onActivityResult 호출하여 이미지 소스코드인 FragmentActivity onActivityResult 호출되도록 해야지 Fragment에서 DATA 받을 있습니다.

 

따라서, Framgment 아니라 Fragment 포함하는 Activity onActivityResult 에서 DATA 받아 처리를 하고 싶다면 Framgent startActivityForResult 아니라 getActivity().startActivityForResult() 호출해서 Activity startActivityForResult() 호출되도록 해주어야 합니다.

 

FragmentActivity 아닌 andorid.app.Acivity 상속받는 경우는 어떻게 될까요?

Fragment onActivityResult 당연히 동작하지 않는다. 직접 Acitivity 또는 Fragment 에 것인지, 어디서 왔는 확인 하는 등의 로직등을 구현해주어야 합니다.

 

이러한 이유뿐만 아니라 호환성유지를 위해서 Android.app,fragment 보다는 androidx 패키지의 Fragment 사용하기를 권장(강제) 합니다.

(https://stackoverflow.com/questions/15109017/difference-between-android-app-fragment-and-android-support-v4-app-fragment,

 

Difference between android.app.Fragment and android.support.v4.app.Fragment

What is the difference between android.app.Fragment and android.support.v4.app.Fragment, and what are the circumstances in which each should be used?

stackoverflow.com

https://www.andreasschrade.com/android-native-fragment-or-support-fragment-or-androidx-fragment)

 

Native Fragment vs. Support Fragment vs. Androidx Fragment

or… Fragment vs. Fragment vs. Fragment Someone who is new in the field of Android development might wonder… What is the difference between all these different Fragment implementations??? First of all, what kind of Fragment implementations do exist? Lib

www.andreasschrade.com

support버전의 Fragment 사용할 때는 activity FragmentActivity 사용해야하며, FragmentActivity. getSupportFragmentManager() 이용해 FragmentManager() 얻어야 한다.

 (https://developer.android.com/reference/androidx/fragment/app/Fragment)

 

Fragment  |  Android 개발자  |  Android Developers

Fragment public class Fragment extends Object implements ComponentCallbacks, View.OnCreateContextMenuListener, LifecycleOwner, ViewModelStoreOwner, HasDefaultViewModelProviderFactory, SavedStateRegistryOwner, ActivityResultCaller java.lang.Object    ↳

developer.android.com

 

최근에는 기본 startActivityForResult() 및 onActivityResult() API는 모든 API 수준의 Activity 클래스에서 사용할 수 있지만 AndroidX Activity 1.2.0-alpha02 와 프래그먼트 1.3.0-alpha02에서 도입된 Activity Result API를 사용하는 것이 더 좋다고 합니다.

 

https://developer.android.com/training/basics/intents/result#java

 

활동으로부터 결과 가져오기  |  Android 개발자  |  Android Developers

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

developer.android.com