更新的回答:
我可能会遇到哪些麻烦情况?
在将Fragment
添加到返回栈并从onSaveInstanceState()
中传递Bundle
到配置更改时,调用setRetainInstance(true)
将使Bundle
在配置更改时为null。
(我不确定开发人员是否会尝试这样做,因为使用setRetainInstance(true)
使onSaveInstanceState()
有点多余,但我没有在API文档中看到这种行为,所以我写了这个答案)。
如果同时调用addToBackStack()
和setRetainInstance(true)
,则与仅调用addToBackStack()
相比,在配置更改时setRetainInstance()
部分更改了Fragment
生命周期方法的调用和参数值。
具体而言,在下面的测试中,查看仅调用addToBackStack()
和同时调用setRetainInstance(true)
会发生什么,并在配置更改时观察结果:
仅调用addToBackStack()
而不调用setRetainInstance(true)
:
- 调用
onCreate()
和onDestroy()
。
- 从
onSaveInstanceState()
传递的一个bundle作为参数在onCreateView()
中接收。
同时调用addToBackStack()
和setRetainInstance(true)
:
- 不会调用
onCreate()
和onDestroy()
。这在API文档中有提到。
- 不会在
onCreateView()
中接收从onSaveInstanceState()
传递的bundle。传入的Bundle
为null。
进行了记录方法调用和测试参数是否为null的测试:
在Activity
中:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyFragment fragment;
if (savedInstanceState != null) {
fragment = (MyFragment) getFragmentManager().findFragmentByTag("my_fragment_tag");
} else {
fragment = new MyFragment();
FragmentTransaction t = getFragmentManager().beginTransaction();
t.addToBackStack(null);
t.add(android.R.id.content, fragment, "my_fragment_tag").commit();
}
}
在
Fragment
中:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
}
并且
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("test", "value");
super.onSaveInstanceState(outState);
}
测试1:当调用addToBackStack()
,且未调用setRetainInstance(true)
时,Fragment的生命周期如下:
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
- onStart()
- onResume()
[设备从竖屏旋转到横屏]
- onPause()
- onSaveInstanceState()
- onStop()
- onDestroyView()
- onDestroy()
- onDetach()
- onAttach()
- onCreate()
- onCreateView()(带有非空bundle参数)
- onStart()
- onResume()
测试2和3:调用setRetainInstance(true)
并调用/不调用addToBackStack()
时,Fragment的生命周期如下(结果相同):
- onAttach()
- onCreateView()
- onActivityCreated()
- onStart()
- onResume()
[设备从竖屏旋转到横屏]
- onPause()
- onSaveInstanceState()
- onStop()
- onDestroyView()
- onDetach()
- onAttach()
- onCreateView()(带有空的bundle参数)
- onStart()
- onResume()