programing

Understanding Fragment's setRetainInstance(boolean)

megabox 2023. 9. 21. 20:13
반응형

Understanding Fragment's setRetainInstance(boolean)

Starting with the documentation:

public void setRetainInstance (boolean retain)

Control whether a fragment instance is retained across Activity re-creation (such as from a configuration change). This can only be used with fragments not in the back stack. If set, the fragment lifecycle will be slightly different when an activity is recreated:

  • onDestroy() will not be called (but onDetach() still will be, because the fragment is being detached from its current activity).
  • onCreate(Bundle) will not be called since the fragment is not being re-created.
  • onAttach(Activity) and onActivityCreated(Bundle) will still be called.

I have some questions:

  • Does the fragment also retain its view, or will this be recreated on configuration change? What exactly does "retained" mean?

  • Will the fragment be destroyed when the user leaves the activity?

  • Why doesn't it work with fragments on the back stack?

  • Which are the use cases where it makes sense to use this method?

First of all, check out my post on retained Fragments. It might help.

Now to answer your questions:

Does the fragment also retain its view state, or will this be recreated on configuration change - what exactly is "retained"?

네.Fragment의 상태는 구성 변경 전체에 걸쳐 유지됩니다.구체적으로 "retained"는 구성 변경 시 조각이 제거되지 않음을 의미합니다.즉,Fragment구성 변경이 기본적인 원인이 되더라도 유지됩니다.Activity파괴될 겁니다

Will the fragment be destroyed when the user leaves the activity?

같은Activitys,Fragment메모리 자원이 부족할 때 s는 시스템에 의해 파괴될 수 있습니다.프래그먼트가 구성 변경 전반에 걸쳐 인스턴스 상태를 유지하는지 여부는 시스템의 파괴 여부에 영향을 미치지 않습니다.Fragment당신이 떠나자마자Activity. 만약 당신이 떠나시면.Activity(즉, 홈 버튼을 누름으로써),Fragment파괴될 수도 있고 그렇지 않을 수도 있습니다.만약 당신이 떠나시면.Activity뒤로 버튼을 눌러(thus, 호출)finish()그리고 효과적으로 파괴하고 있습니다.Activity), 모두Activity 있는 Fragment입니다.

백스택에 파편이 있으면 왜 작동하지 않습니까?

여러 가 생각하는 가장 는 만, 만입니다.Activity다에 합니다.FragmentManager, .FragmentManager백스택을 관리합니다.즉을 하더라도,FragmentActivity )FragmentManager의 백스택)은(는) 구성 변경 시 삭제됩니다.유지 프래그먼트와 비유지 프래그먼트가 모두 동일한 백스택에 존재하도록 허용하면 작업이 까다로워질 수 있기 때문입니다.

이 방법을 사용하는 것이 타당한 사용 사례는 무엇입니까?

보존 프래그먼트는 상태 정보(특히 스레드 관리)를 활동 인스턴스에 전파하는 데 상당히 유용할 수 있습니다.를 들어 어,다 을 할 수 .Thread아니면AsyncTask, 운영을 관리합니다.자세한 내용은 이 항목에 대한 내 블로그 게시물을 참조하십시오.

일반적으로, 저는 그것을 사용하는 것과 유사하게 취급할 것입니다.onConfigurationChanged의 소리와 함께Activity할 수 없습니다.…. 방향 변경을 올바르게 실행하기가 귀찮다고 해서 밴드로 사용하지 마십시오.필요할 때만 사용하세요.

setRetaininstance의할 합니다.의.일때만 유용합니다.activity다로 으로 인해 되고 다시 됩니다.onRetainNonConfigurationInstance이 그대로 않습니다 즉, 장치를 돌리면 보존된 조각이 그대로 남아 있지만(파괴되어 다시 생성되지는 않습니다), 런타임이 리소스를 회수하기 위해 작업을 종료하면 아무것도 남지 않습니다.뒤로 버튼을 누르고 활동을 종료하면 모든 것이 파괴됩니다.

보통 이 기능을 사용하여 방향 변경 시간을 저장합니다.서버에서 여러 개의 비트맵을 다운로드했는데 각각의 비트맵이 1MB라고 가정해 보겠습니다. 사용자가 실수로 장치를 회전시켰을 때 다시는 다운로드 작업을 하고 싶지 않습니다. 저는 을 만듭니다.Fragment하기.setRetainInstance화면 방향이 바뀌어도 모든 비트맵이 그대로 유지됩니다.

SetRetainInstance(true)를 사용하면 조각의 생존이 가능합니다.구성원은 회전과 같은 구성 변경 중에도 유지됩니다.하지만 배후에서 활동이 중단되면 여전히 사망할 수도 있습니다.백그라운드에 포함된 작업이 시스템에 의해 중지된 경우에는 SaveInstanceState에서 적절하게 처리한 시스템에 의해 InstanceState가 저장되어야 합니다.다른 말로 하면 항상 saveInstanceState가 호출됩니다.SetRetainInstance가 참이고 fragment/activity가 아직 삭제되지 않은 경우에는 생성 뷰에서 호출되지 않지만, SetRetainInstance가 삭제되어 다시 가져오려고 하면 여전히 호출됩니다.

다음은 안드로이드 활동/프래그먼트에 대한 몇 가지 분석입니다.http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html

setRetainInstance() - 사용되지 않음

애즈 프래그먼트 버전 1.3.0-alpha01

Fragments의 setRetainInstance() 메서드가 더 이상 사용되지 않습니다.ViewModels의 도입으로 개발자들은 Activities, Fragments 및 Navigation 그래프와 연관될 수 있는 상태 유지를 위한 특정 API를 갖게 되었습니다.이를 통해 개발자는 보존되지 않은 일반적인 프래그먼트를 사용하고 보존하고자 하는 특정 상태를 별도로 유지할 수 있으며, 보존 상태의 단일 생성 및 파기(즉, ViewModel의 생성자와 수신한 on Cleared() 콜백)이라는 유용한 속성을 유지하면서 공통적인 누출 소스를 피할 수 있습니다.

setRetainInstance(boolean)는 활동 수명 주기에 연결되지 않은 일부 구성 요소를 가질 때 유용합니다.이 기법은 예를 들어 rxloader가 "rxjava의 Observable에 대한 Android의 활동 라이프사이클을 처리"하는 데 사용됩니다(여기서 발견했습니다).

언급URL : https://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean

반응형