(1)fragment各种情况下的生命周期
(2)Fragment状态保存 startActivityForResult是哪个类的方法,在什么情况下使用?
(3)如何实现Fragment的滑动?
(4)fragment之间传递数据的方式?
(5)Activity与Fragment通信的方式?
(6)ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?
(7)Fragment 如果在Adapter中使用 应该如何解耦?
(8)微信上消息小红点的原理 (观察者模式)
一. Fragment在各种情况下的生命周期
1)相比于Activity的生命周期多了如下几个方法
onAttach():当Fragment与Activity发生关联时,该方法被调用
onCreateView():创建Fragment的视图
onActivityCreate():当Activity的onCreate()返回时被调用
onDestroyView():与onCreateView()是对应的,当Fragment的视图被销毁时,该方法被调用
onDetach(): 与onAttach() 方法相对应,当Fragment与Activity的关联被取消时,该方法被调用
2)Activity中调用 replace() 方法时的生命周期
新替换的Fragment:onAttach--> onCreate -->onCreateView --> onViewCreated --> onActivityCreated --> onStart --> onResume
被替换的Fragment: onPause --> onStop --> onDestroyView --> onDestroy --> onDetach
3) Activity中调用replace()方法和addToBackStack()方法时的生命周期
新替换的Fragment(没有在BackStack中):
onAttach > onCreate > onCreateView > onViewCreated > onActivityCreated > onStart > onResume
新替换的Fragment(已经在BackStack中):
onCreateView > onViewCreated > onActivityCreated > onStart > onResume
被替换的Fragment:onPause > onStop > onDestroyView
4)Fragment在运行状态后跟随Activity的生命周期
Fragment在上述的各种情况下进入了onResume后,则进入了运行状态,以下4个生命周期方法将跟随所属的Activity一起被调用:
onPause > onStop > onStart > onResume
5)常见场景
- 屏幕灭掉时
onPause() onSaveInstanceState() onStop() - 屏幕解锁
onStart() onResume() - 切换到其他Fragment
onPause() onStop() onDestroyView() - 切换回本身的Fragment
onCreateView() onActivityCreated() onStart() onResume() - 回到桌面
onPause() onSaveInstanceState() onStop() - 回到应用
onStart() onResume() - 退出应用
onPause() onStop() onDestroyView() onDestroy() onDetach()
二. Fragment状态保存 startActivityForResult是哪个类的方法,在什么情况下使用?
Fragment调用startActivityForResult --->
HostCallbacks . onStartActivityFromFragment --->
FragmentActivity.startActivityFromFragment
Fragment 和 Activity 都有startActivityForResult方法,切记不要调用错误。如果发现Fragment 的onActivityResult拿不到数据,而FragmentActivity拿到了数据,并且requestCode与Fragment中用到的requestCode不一致,那么一定是在Fragment中调用了FragmentActivity的startActivityForResult方法。
源码可以看出requestCode不一致的原因了,使用Fragment发起的请求,因为一个Activity可以包含多个Fragment,而且都可以发起请求,那么会使用一个容器来保存发起请求的Fragment和它对应的requestCode,mPendingFragmentActivityResults就是这个容器,发起请求的时候将在容器中的index和requestCode算在一起,作为最终的requestCode。
FragmentActivity 和 它的内部类 HostCallbacks 分别展现了两个startActivityForResult方法的调用。FragmentActivity本身是有startActivityForResult方法,依附它的Fragment也有startActivityForResult方法,那么放在HostCallbacks里,这就体现了HostCallbacks是一座桥梁,链接了Fragment和FragmentActivity之间的通信。
三. 如何实现Fragment的滑动?
可以结合Viewpager。
四. fragment之间传递数据的方式?
- 直接在一个Fragment中调用另外一个Fragment中的方法
- 使用回调接口
- 使用广播
- Fragment直接调用Activity中的public方法
- EventBus、RxBus
- Bundle和setArguments(bundle)
五. Activity与Fragment通信的方式?
1)Handler
2)广播
3)EventBus
4)接口回调
5)Bundle和setArguments(bundle)
六. ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?
设置懒加载。通过setUserVisibleHint方法判断可见性。
其中 FragmentStatePagerAdapter 适合大量页面,不断重建和销毁。
FragmentPagerAdapter 适合少量页面,常驻内存。
详见差异描述:https://segmentfault.com/a/1190000012455727
网友评论