2018.03.05 Android 记一次关于Fragment生命周期的讨论。

1、重温基础

1)activity 生命周期

activity 启动: onCreat() --> onStart() --> onResume()
activity 关闭: onpause() --> onStop() --> onDestroy();

2)Fragment 生命周期

Fragment创建: onAttach() -->onCreatView() -->onViewCreated() -->onActivityCreated() -->onStart() -->onResume();

Fragment销毁: onPause() -->onStop() -->onDestroyView() -->onDestroy()-->onDetach()

2、Activity和Fragment 的生命周期回调顺序:

问题:
在activity中创建一个fragment ,其生命周期如何调用的呢?

话不多说直接上图

当点击home键时有如何进行呢?

注意:activity 和fragment生命周期的先后顺序。

但是在网上很多人给出的生命周期顺序是这样的:

细心地同学发现了,activity 和fragment生命周期的顺序刚好相反。很奇怪 我很快发现问题原因:

//我写的
 @Override
    protected void onPause() {
        Log.d("activity", "---->onPause");
        super.onPause();
    }
    
//对方写的
@Override
    protected void onPause() {
        super.onPause();
        Log.d("activity", "---->onPause");
    }
复制代码

刚好顺序调用反了!那怎么知道 是先走activity 的onPause()方法 还是 先走fragment 的onPause()方法呢? 问题一度尴尬!(其实我已经知道结果了...嘿嘿)

//之后就出现了  以下的代码!
 @Override
    protected void onPause() {
        Log.d("activity", "---->onPause 之前");
        super.onPause();
        Log.d("activity", "---->onPause 之后");
    }
复制代码

果然发现:先走avtivity的onPause()方法,之后通过调用才调用 fragment的onPause().

3、问题挖掘

通过log日志猜测:Fragment的onPause方法是通过 super.onPause()调用的。
查看源码

//FragmentActivity

 /**
     * Dispatch onPause() to fragments.
     */
    @Override
    protected void onPause() {
        super.onPause();
        mResumed = false;
        if (mHandler.hasMessages(MSG_RESUME_PENDING)) {
            mHandler.removeMessages(MSG_RESUME_PENDING);
            onResumeFragments();
        }
        //果然 是通过 FragmentController 分发Pause()改变fragment的状态的
        mFragments.dispatchPause();
    }

...
//FragmentController
 /**
     * Moves all Fragments managed by the controller's FragmentManager
     * into the pause state.
     * <p>Call when Fragments should be paused.
     *
     * @see Fragment#onPause()
     */
    public void dispatchPause() {
        mHost.mFragmentManager.dispatchPause();
    }
复制代码

4、结论

在activity 中创建的fragment 其生命周期是:先调用activity对应的生命周期,之后由activity的父类FragmentActivity通过FragmentController 更改Fragment对应的生命周期的。


有问题欢迎指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值