重温 Fragment 分析一:生命周期

文章目录
  1. 1. 简介 Fragment
  2. 2. Fragment 的生命周期
  3. 3. 归纳生命周期
  4. 4. 参考文献

天下古今之庸人,皆以一惰字致败;天下古今之才人,皆以一傲字致败。

想必从事 Android 开发的工程师,日常的工作中,总挂在嘴边的离不开 Activity 和 Fragment 了。此前对 Activity 的两个重难点作出过简单的分析,这期,先来谈一谈 Fragment 的生命周期。

简介 Fragment

我们知道,Android 上的界面展示是通过 Activity 实现的,但其也具有局限性。比如,相同的界面在手机上正常显示,但是在大屏幕的平板上,界面可能会被过分拉长,不再合适。自 Android 3.0 开始,便引入 Fragment 解决这样的问题。

Fragment 表示 Activity 中的行为或用户界面部分,可以将多个 Fragment 组合在一个 Activity 中来构建多窗格界面,以及在多个 Activity 中重复使用某个 Fragment。此外,Fragment 可以视为 Activity 的模块化组成部分,其具有自己的生命周期,能接受自己的输入事件,省去在 Activity 中加入一堆控件的事件处理代码。更重要的是,可以在 Activity 运行时动态地添加、替换和移除某个 Fragment。

Fragment 的生命周期

Fragment 必须始终嵌入在 Activity 中,其生命周期受宿主 Activity 生命周期的影响。比如,当 Activity 暂停时,其中的 Fragment 也会暂停;当 Activity 被销毁时,所有 Fragment 也会被销毁;当 Activity 处于运行期或已恢复生命周期状态时,可以独立操作每个 Fragment,添加或移除它们。同 Activity 一样,Fragment 也有自己的生命周期,FragmentLifeCycleDemo 地址:FragmentLifeCycleDemo

主要看该部分代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public class SubFragment extends Fragment {

private static final String TAG = "SUB_FRAGMENT";

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(TAG, "onAttach");
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "onCreateView");
View view = inflater.inflate(R.layout.fragment_sub, container, false);
return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated");
}

@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}

@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}

@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}

@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}

@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView");
}

@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}

@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach");
}

}

运行程序,效果如下图:

查看 Android Monitor 中的 logcat 如下:

1
2
3
4
5
6
06-24 23:21:00.308 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onAttach
06-24 23:21:00.308 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onCreate
06-24 23:21:00.308 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onCreateView
06-24 23:21:00.308 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onActivityCreated
06-24 23:21:00.309 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onStart
06-24 23:21:00.309 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onResume

接着,按一下 Home 键,logcat 如下:

1
2
06-24 23:22:53.186 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onPause
06-24 23:22:53.189 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onStop

再重新进入应用,logcat 如下:

1
2
06-24 23:24:21.487 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onStart
06-24 23:24:21.487 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onResume

最后,点击 Back 键退出应用,logcat 如下:

1
2
3
4
5
06-24 23:25:40.738 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onPause
06-24 23:25:41.170 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onStop
06-24 23:25:41.170 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onDestroyView
06-24 23:25:41.171 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onDestroy
06-24 23:25:41.171 14205-14205/com.iamasoldier6.fragmentlifecycledemo D/SUB_FRAGMENT: onDetach

归纳生命周期

Fragment 的生命周期与 Activity 的生命周期很相似。和 Activity 一样,Fragment 也以三种状态存在:

运行

Fragment 在运行的 Activity 中可见。

暂停

另一个 Activity 位于前台并具有焦点,但此 Fragment 所在的 Activity 仍然可见(前台 Activity 部分透明,或未覆盖整个屏幕)。

停止

Fragment 不可见。宿主 Activity 已停止,或 Fragment 已从 Activity 中移除,但已添加到返回栈。停止的 Fragment 仍然处于活动状态(系统会保留所有状态和成员信息)。然而,它对用户不再可见,若 Activity 被终止,它也会被终止。

同 Activity 一样,若 Activity 的进程被终止,假使需要在重建 Activity 时恢复 Fragment 状态,以可以使用 Bundle 保留 Fragment 的状态。同时,可以在 Fragment 的 onSaveInstanceState() 回调期间保存状态。

Activity 生命周期与 Fragment 生命周期之间的最显著差异在于其在各自返回栈中的存储方式不同。默认情况下,Activity 停止时会被放入由系统管理的 Activity 返回栈,用户通过返回按钮回退到 Activity;然而,只有在移除 Fragment 的事物执行期间,通过调用 addToBackStack() 显式请求保存实例时,系统才会将 Fragment 放入由宿主 Activity 管理的返回栈。

注意!

若需要 Fragment 内的某个 Context 对象,则能调用 getActivity()。仅在 Fragment 附加到 Activity 时调用 getActivity(),若 Fragment 没有附加,或在其生命周期结束期间分离,则 getActivity() 将返回 null。

同样,参见 Android 官网整理图如下:

重点看与 Activity 未重合的回调方法,归纳及总结如下:

onAttach()

Fragment 与 Activity 关联时调用( Activity 传递到该方法内)。

onCreateView()

系统会在 Fragment 第一次绘制用户界面时调用。注意,要为 Fragment 绘制 UI,从此方法中返回的 View 须是 Fragment 布局的根视图。若 Fragment 未提供 UI,可以返回 null。

onActivityCreated()

在 Activity 的 onCreate() 方法已经返回时调用。

onDestroyView()

移除与 Fragment 关联的视图层次结构时调用。

onDetach()

取消 Fragment 与 Activity 的关联时调用。

综合 Activity 与 Fragment 之间生命周期回调方法的对应同步关系,参见 GitHub 上 The Complete Android Activity / Fragment Lifecycle

至此,关于 Fragment 的生命周期,其简单的回顾与归纳分析完毕,下一篇是对 Fragment 的使用方面的总结。

本人才疏学浅,如有疏漏错误之处,望读者中有识之士不吝赐教,谢谢。

1
Email: [email protected] / WeChat: Wolverine623

您也可以关注我个人的微信公众号码农六哥第一时间获得博客的更新通知,或后台留言与我交流

参考文献

1.https://developer.android.com/guide/components/fragments.html?hl=zh-cn#Creating

2.http://blog.csdn.net/guolin_blog/article/details/8881711