在Activity中加入一个Fragment,设置一个按钮,切换屏幕
public class SetRetainInstanceAc extends AppCompatActivity {
private static final String TAG = "SecondActivity";
private SetRetainInstanceFragment fragment;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_set_retain_instance);
findViewById(R.id.btn_change).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e(TAG, "onClick: " + getRequestedOrientation());
if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
});
FragmentManager manager = getSupportFragmentManager();
Fragment simple_fragment = manager.findFragmentByTag("simple_fragment");
if (simple_fragment == null) {
fragment = new SetRetainInstanceFragment();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(fragment, "simple_fragment").commit();
}
Log.e(TAG, "simple_fragment = " + simple_fragment);
}
}
Fragment的onCreate()中调用setRetainInstance(true)和不调用对比
不调用:
onAttach---onCreate--onCreateView--onActivityCreated--onStart--onResume正常的生命周期
切换屏幕:
onPause--onStop--onDestroyView--onDestroy--onDetach -- 每次都销毁Fragment
onAttach---onCreate--onCreateView--onActivityCreated--onStart--onResume
每次都会走onCreate,每次创建一个新的Fragment
调用:
onAttach---onCreate--onCreateView--onActivityCreated--onStart--onResume 正常的生命周期
切换屏幕:
onPause--onStop--onDestroyView--onDetach -- 不销毁Fragment
onAttach--onCreateView--onActivityCreated--onStart--onResume //不执行onCreate
有Fragment实例之后,再切换,不会走onDestroy,不会走onCreate,并且发现fragment实例是之前同一个