Moosphan/Android-Daily-Interview

2019-10-10:请谈谈Fragment的生命周期?

Moosphan opened this issue · 6 comments

2019-10-10:请谈谈Fragment的生命周期?

1.fragment跟activity生命周期
2.fragment在viewpager中的生命周期
3.fragment之间传递数据方法有哪几种
4.fragment传递数据中哪种你认为是最好的为什么
5.一个项目中只有一个activity是否可取为啥呢
6.fragment好与坏,

1,onAttach:fragment 和 activity 关联时调用,且调用一次。在回调中可以将参数 content 转换为 Activity保存下来,避免后期频繁获取 activity。

​ 2,onCreate:和 activity 的 onCreate 类似

​ 3,onCreateView:准备绘制 fragment 界面时调用,返回值为根视图,注意使用 inflater 构建 View时 一定要将 attachToRoot 指明为 false。

​ 4,onActivityCreated:activity 的onCreated 执行完时调用

​ 5,onStart:可见时调用,前提是 activity 已经 started

​ 6,onResume:交互式调用,前提是 activity 已经 resumed

​ 7,onPause:不可交互时调用

​ 8,onStop:不可见时调用

​ 9,onDestroyView:移除 fragment 相关视图时调用

​ 10,onDestroy:清除 fragmetn 状态是调用

​ 11,onDetach:和 activity 解除关联时调用

​ 从生命周期可以看出,他们是两两对应的,如 onAttach 和 onDetach ,

onCreate 和 onDestory ,onCreateView 和 onDestroyView等

ragment 在 ViewPager中的生命周期

​ ViewPager 有一个预加载机制,他会默认加载旁边的页面,也就是说在显示第一个页面的时候 旁边的页面已经加载完成了。这个可以设置,但不能为0,但是有些需求则不需要这个效果,这时候就可以使用懒加载了:懒加载的实现

​ 1,当 ViewPager 可以左右滑动时,他左右两边的 fragment 已经加载完成,这就是预加载机制

​ 2,当 fragment 不处于 ViewPager 左右两边时,就会执行 onPause,onStop,OnDestroyView 方法。

fragment 之间传递数据方法

​ 1,使用 bundle,有些数据需要被序列化

​ 2,接口回调

​ 3,在创建的时候通过构造直接传入

​ 4,使用 EventBus 等

单 Activity 多 fragment 的优点,fragment 的优缺点

​ fragment 比 activity 占用更少的资源,特别在中低端手机,fragment 的响应速度非常快,如丝般的顺滑,更容易控制每个场景的生命周期和状态

​ 优缺点:非常流畅,节省资源,灵活性高,fragment 必须赖于acctivity,而且 fragment 的生命周期直接受所在的 activity 影响。

onAttach() ,片段和活动之间调用,调用一次,保存数据;
oncreate(), 和轰动一样创建活动
onActivityCreated(),活动oncreate执行完时调用
onpause(), 不可交互时调用
onstop(), 不可交互时调用
onDestory(), 清除fragment状态调用
onDetach(),和活动解除关联时调用。
1,当ViewPager可以左右滑动时,他左右两边的片段已经加载完成,这就是预加载机制;
2,当片段不位于ViewPager左右两边时,就会执行on Pause,onStop,OnDestroyView方法。

片段之间传递数据方法
片段之间传递数据方法
1,使用包,有些数据需要被序列化

2,接口

3,在创造的时候通过构造直接替代

4,使用EventBus等

单活动多fragment的优点,fragment的优缺点
片段比活动占用占用的资源,特别是中低端手机,fragment的响应速度非常快,如丝般的顺滑,更容易控制每个场景的生命周期和状态

优缺点:非常流畅,节省资源,规模高,碎片必须赖于活动性,而且碎片的生命周期直接受其所在的活动影响。

按照正常的执行顺序如下:
onAttach
onCreate
onCreateView
onViewCreated
onActivityCreated
onStart
onResume
onPause
onStop
onDestroyView
onDestroy
onDetach

  • A表示的是Activity,F表示的是Fragment

Activity中的生命周期

把Fragment添加到id为content的布局上

var transaction = supportFragmentManager.beginTransaction()
        transaction.replace(R.id.content, RecyclerViewFragment.getInstance())
        transaction.commit()

启动时
A->onCreate
F->onAttach->onCreate->onCreateView->onActivityCreate->onStart
A->onStart->onResume
F-onResume
点击返回键
A->onPause
F->onPause
A->onStop
F->onStop
A->onDestroy
F->onDestroyView->onDestory->onDetach

Fragment在ViewPager中的生命周期

A->onCreate->onStart->onResume
F0->onAttach->onCreate
F1->onAttach->onCreate
F0->onCreateView->onActivityCreate->onStart->onResume
F1->onCreateView->onActivityCreate->onStart->onResume

onAttach Activity关联Fragment时调用
onCreate 创建fragment时调用
onCreateView 绘制fragment时调用
onActivityCreated Activity创建完成调用
onStart fragment可见
onResume fragment可触摸
onPause fragment不可触摸
onStop fragment不可见
onDestroyView 移除 fragment 相关视图时调用
onDestroy 关闭fragmetn
onDetach 解除Activity关联