Fragment
和Activity
一样也有着自己的生命周期,并且两者的生命周期很相似。
Fragment
生命周期的回调函数跟随者其宿主Activity
的生命周期回调。
Fragment
生命周期和回调方法
-
onAttach()
当Fragment
和宿主Activity
建立关联时调用。 -
onCreate()
Fragment
创建时被回调的函数。 -
onCreateView()
Fragment
布局加载,创建视图时调用。 -
onStart()
Fragment
启动时被调用,此时Fragment
转变成用户可见状态。 -
onRestart()
Fragment
重新启动时被调用,由停止状态转变为运行状态前调用。 -
onResume()
Fragment
恢复,Fragment
处于运行状态,准备好了与用户交互。 -
onPause()
Fragment
被暂停时调用,其宿主Activity
被暂停,此函数在系统启动/恢复另一个Activity
时调用。 -
onStop()
Fragment
停止,Fragment
处于完全不可见状态。 -
onDestroyView():
Fragment
的视图被移除时调用。 -
onDestroy()
Fragment
销毁前被调用。 -
onDetach():
Fragment
和宿主Activity
解除关联时调用此函数。
代码演示
打开 FragmentSample
项目,
- 编辑
FragmentA
代码
Java 代码:
public class FragmentA extends Fragment {
private static final String TAG = "Life_FragmentA";
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
Log.i(TAG, "onAttach()");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate()");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i(TAG, "onCreateView()");
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_a, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.i(TAG, "onActivityCreated()");
}
@Override
public void onStart() {
super.onStart();
Log.i(TAG, "onStart()");
}
@Override
public void onResume() {
super.onResume();
Log.i(TAG, "onResume()");
}
@Override
public void onPause() {
super.onPause();
Log.i(TAG, "onPause()");
}
@Override
public void onStop() {
super.onStop();
Log.i(TAG, "onStop()");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.i(TAG, "onDestroyView()");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy()");
}
@Override
public void onDetach() {
super.onDetach();
Log.i(TAG, "onDetach()");
}
}
Kotlin 代码:
class FragmentA : Fragment() {
companion object {
private const val TAG = "Life_FragmentA"
}
override fun onAttach(context: Context) {
super.onAttach(context)
Log.i(TAG, "onAttach()")
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i(TAG, "onCreate()")
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
Log.i(TAG, "onCreateView()")
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_a, container, false)
}
override fun onStart() {
super.onStart()
Log.i(TAG, "onStart()")
}
override fun onResume() {
super.onResume()
Log.i(TAG, "onResume()")
}
override fun onPause() {
super.onPause()
Log.i(TAG, "onPause()")
}
override fun onStop() {
super.onStop()
Log.i(TAG, "onStop()")
}
override fun onDestroyView() {
super.onDestroyView()
Log.i(TAG, "onDestroyView()")
}
override fun onDestroy() {
super.onDestroy()
Log.i(TAG, "onDestroy()")
}
override fun onDetach() {
super.onDetach()
Log.i(TAG, "onDetach()")
}
}
给各个回调函数增加日志。
- 编辑
MainActivity
代码
Java 代码:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "Life_MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate()");
setContentView(R.layout.activity_main);
......
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart()");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart()");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume()");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause()");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop()");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy()");
}
}
Kotlin 代码:
class MainActivity : AppCompatActivity() {
companion object {
private const val TAG = "Life_MainActivity"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i(TAG, "onCreate()")
setContentView(R.layout.activity_main)
......
}
override fun onStart() {
super.onStart()
Log.i(TAG, "onStart()")
}
override fun onRestart() {
super.onRestart()
Log.i(TAG, "onRestart()")
}
override fun onResume() {
super.onResume()
Log.i(TAG, "onResume()")
}
override fun onPause() {
super.onPause()
Log.i(TAG, "onPause()")
}
override fun onStop() {
super.onStop()
Log.i(TAG, "onStop()")
}
override fun onDestroy() {
super.onDestroy()
Log.i(TAG, "onDestroy()")
}
}
这里也给各个回调函数增加日志,主要是用来对比Fragment
和Activity
的生命周期的回调函数。
- 运行代码
-
代码运行后,查看日志,添加日志过滤
Life_FragmentA
,得到Fragment
的日志记录:
-
日志过滤
Life_
,得到Fragment
和Activity
的日志记录:
-
点击系统返回键,退出 app,依次添加日志过滤
Life_FragmentA
、Life_
分别得到:
a. Fragment
生命周期完整的日志记录:
b. Fragment
和Activity
的生命周期对比:
对比下来,Fragment
生命周期的回调函数跟其宿主Activity
的生命周期回调保持一致。
项目代码地址
Java 版:
https://github.com/BethelDEV/shaguaAndroid/tree/main/javaSource/FragmentSampleKotlin 版:
https://github.com/BethelDEV/shaguaAndroid/tree/main/kotlinSource/FragmentSample