美文网首页
Android基础(2)Fragment详解

Android基础(2)Fragment详解

作者: perry_Fan | 来源:发表于2019-02-19 19:27 被阅读0次

    (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之间传递数据的方式?
    1. 直接在一个Fragment中调用另外一个Fragment中的方法
    2. 使用回调接口
    3. 使用广播
    4. Fragment直接调用Activity中的public方法
    5. EventBus、RxBus
    6. 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

    七. Fragment 如果在Adapter中使用 应该如何解耦?

    相关文章

      网友评论

          本文标题:Android基础(2)Fragment详解

          本文链接:https://www.haomeiwen.com/subject/vdjmeqtx.html