Fragment生命周期介绍

2,070 阅读8分钟

Fragment虽然不是官方定义的四大组件,但是在项目中的使用频率完全不亚于非Activity的另外三个组件。

正因为经常需要使用,所以也是面试经常会问到的知识点。关于Fragment面试主要围绕两点展开,1.与Activity交互各自的生命周期和使用add & replace 两种方式的生命周期变化,2.Activity与Fragment数据传输。本文将围绕这两点来进行阐述。

一.Fragment生命周期

1.Fragment完整生命周期

2021-08-07 10:50:13.540 5066-5066/? D/MyFragment-TEST: onAttach
2021-08-07 10:50:13.541 5066-5066/? D/MyFragment-TEST: onCreate
2021-08-07 10:50:13.548 5066-5066/? D/MyFragment-TEST: onViewCreated
2021-08-07 10:50:13.548 5066-5066/? D/MyFragment-TEST: onActivityCreated
2021-08-07 10:50:13.548 5066-5066/? D/MyFragment-TEST: onViewStateRestored
2021-08-07 10:50:13.549 5066-5066/? D/MyFragment-TEST: onStart
2021-08-07 10:50:13.554 5066-5066/? D/MyFragment-TEST: onResume
------锁屏-------
2021-08-07 10:51:11.606 5066-5066/com.example.myfirstproject D/MyFragment-TEST: onPause
2021-08-07 10:51:11.668 5066-5066/com.example.myfirstproject D/MyFragment-TEST: onStop
2021-08-07 10:51:11.675 5066-5066/com.example.myfirstproject D/MyFragment-TEST: onSaveInstanceState
------解屏-----
2021-08-07 10:51:29.387 5066-5066/com.example.myfirstproject D/MyFragment-TEST: onStart
2021-08-07 10:51:29.389 5066-5066/com.example.myfirstproject D/MyFragment-TEST: onResume
------退出------
2021-08-07 10:51:38.153 5066-5066/com.example.myfirstproject D/MyFragment-TEST: onPause
2021-08-07 10:51:38.154 5066-5066/com.example.myfirstproject D/MyFragment-TEST: onStop
2021-08-07 10:51:38.155 5066-5066/com.example.myfirstproject D/MyFragment-TEST: onDestroyView
2021-08-07 10:51:38.172 5066-5066/com.example.myfirstproject D/MyFragment-TEST: onDestroy
2021-08-07 10:51:38.173 5066-5066/com.example.myfirstproject D/MyFragment-TEST: onDetach

onAttach():Fragment和Activity相关联时调用。可以通过该方法获取Activity引用,还可以通过getArguments()获取参数。

onCreate():Fragment被创建时调用

onActivityCreated():当Activity完成onCreate()时调用

onStart():当Fragment可见时调用。

onResume():当Fragment可见且可交互时调用

onPause():当Fragment不可交互但可见时调用。

onStop():当Fragment不可见时调用。

onDestroyView():当Fragment的UI从视图结构中移除时调用。

onDestroy():销毁Fragment时调用。

onDetach():当Fragment和Activity解除关联时调用。

2.Fragment与Activity交互各自的生命周期

2021-08-07 20:32:48.882 13191-13191/com.example.myfirstproject D/MainActivity-TEST: onCreate
2021-08-07 20:32:49.051 13191-13191/com.example.myfirstproject D/MyFragment-TEST: onAttach
2021-08-07 20:32:49.051 13191-13191/com.example.myfirstproject D/MainActivity-TEST: onAttachFragment
2021-08-07 20:32:49.051 13191-13191/com.example.myfirstproject D/MyFragment-TEST: onCreate
2021-08-07 20:32:49.057 13191-13191/com.example.myfirstproject D/MyFragment-TEST: onViewCreated
2021-08-07 20:32:49.057 13191-13191/com.example.myfirstproject D/MyFragment-TEST: onActivityCreated
2021-08-07 20:32:49.057 13191-13191/com.example.myfirstproject D/MyFragment-TEST: onViewStateRestored
2021-08-07 20:32:49.058 13191-13191/com.example.myfirstproject D/MyFragment-TEST: onStart
2021-08-07 20:32:49.058 13191-13191/com.example.myfirstproject D/MainActivity-TEST: onStart
2021-08-07 20:32:49.062 13191-13191/com.example.myfirstproject D/MainActivity-TEST: onResume
2021-08-07 20:32:49.062 13191-13191/com.example.myfirstproject D/MyFragment-TEST: onResume
---------退出------
2021-08-07 20:35:03.357 13411-13411/com.example.myfirstproject D/MyFragment-TEST: onPause
2021-08-07 20:35:03.358 13411-13411/com.example.myfirstproject D/MyFragment-TEST: onStop
2021-08-07 20:35:03.361 13411-13411/com.example.myfirstproject D/MyFragment-TEST: onDestroyView
2021-08-07 20:35:03.375 13411-13411/com.example.myfirstproject D/MyFragment-TEST: onDestroy
2021-08-07 20:35:03.375 13411-13411/com.example.myfirstproject D/MyFragment-TEST: onDetach
2021-08-07 20:35:03.691 13411-13411/com.example.myfirstproject D/MainActivity-TEST: onPause
2021-08-07 20:35:04.284 13411-13411/com.example.myfirstproject D/MainActivity-TEST: onStop
2021-08-07 20:35:04.292 13411-13411/com.example.myfirstproject D/MainActivity-TEST: onDestroy

首先我们要知道Fragment是依附于Activity页面内创建的。然后注意看Fragment和Activity方法执行先后顺序,可以得出:

创建和重建过程: Activity生命周期优先于Fragment

暂停和销毁过程: Fragment生命周期优先于Activity

3.使用add & replace 两种方式的生命周期变化

这次为了测试Add和Relace不同,需要两个Fragment。第一个MyFragment使用 Add 进容器。然后分别使用 AddReplace添加My2Fragment。然后观察MyFragmentMy2Fragment各自生命周期变化。

先看Add transaction.add(R.id.container,fragment_2)方式输出信息:

2021-08-07 11:07:13.310 7510-7510/com.example.myfirstproject D/MyFragment-TEST: onAttach
2021-08-07 11:07:13.311 7510-7510/com.example.myfirstproject D/MyFragment-TEST: onCreate
2021-08-07 11:07:13.318 7510-7510/com.example.myfirstproject D/MyFragment-TEST: onViewCreated
2021-08-07 11:07:13.318 7510-7510/com.example.myfirstproject D/MyFragment-TEST: onActivityCreated
2021-08-07 11:07:13.318 7510-7510/com.example.myfirstproject D/MyFragment-TEST: onViewStateRestored
2021-08-07 11:07:13.318 7510-7510/com.example.myfirstproject D/MyFragment-TEST: onStart
2021-08-07 11:07:13.324 7510-7510/com.example.myfirstproject D/MyFragment-TEST: onResume
2021-08-07 11:07:20.033 7510-7510/com.example.myfirstproject D/My2Fragment-TEST: onAttach
2021-08-07 11:07:20.034 7510-7510/com.example.myfirstproject D/My2Fragment-TEST: onCreate
2021-08-07 11:07:20.053 7510-7510/com.example.myfirstproject D/My2Fragment-TEST: onViewCreated
2021-08-07 11:07:20.053 7510-7510/com.example.myfirstproject D/My2Fragment-TEST: onActivityCreated
2021-08-07 11:07:20.053 7510-7510/com.example.myfirstproject D/My2Fragment-TEST: onViewStateRestored
2021-08-07 11:07:20.053 7510-7510/com.example.myfirstproject D/My2Fragment-TEST: onStart
2021-08-07 11:07:20.053 7510-7510/com.example.myfirstproject D/My2Fragment-TEST: onResume

可以看出使用Add添加Fragment2,Fragment1Fragment2互不影响。

再看看Relace transaction.replace(R.id.container, fragment_2)方式输出信息:

2021-08-07 11:09:09.712 7806-7806/com.example.myfirstproject D/MyFragment-TEST: onAttach
2021-08-07 11:09:09.713 7806-7806/com.example.myfirstproject D/MyFragment-TEST: onCreate
2021-08-07 11:09:09.723 7806-7806/com.example.myfirstproject D/MyFragment-TEST: onViewCreated
2021-08-07 11:09:09.723 7806-7806/com.example.myfirstproject D/MyFragment-TEST: onActivityCreated
2021-08-07 11:09:09.723 7806-7806/com.example.myfirstproject D/MyFragment-TEST: onViewStateRestored
2021-08-07 11:09:09.724 7806-7806/com.example.myfirstproject D/MyFragment-TEST: onStart
2021-08-07 11:09:09.730 7806-7806/com.example.myfirstproject D/MyFragment-TEST: onResume
2021-08-07 11:09:22.321 7806-7806/com.example.myfirstproject D/My2Fragment-TEST: onAttach
2021-08-07 11:09:22.321 7806-7806/com.example.myfirstproject D/My2Fragment-TEST: onCreate

2021-08-07 11:09:22.324 7806-7806/com.example.myfirstproject D/MyFragment-TEST: onPause
2021-08-07 11:09:22.324 7806-7806/com.example.myfirstproject D/MyFragment-TEST: onStop
2021-08-07 11:09:22.325 7806-7806/com.example.myfirstproject D/MyFragment-TEST: onDestroyView

2021-08-07 11:09:22.346 7806-7806/com.example.myfirstproject D/My2Fragment-TEST: onViewCreated
2021-08-07 11:09:22.346 7806-7806/com.example.myfirstproject D/My2Fragment-TEST: onActivityCreated
2021-08-07 11:09:22.346 7806-7806/com.example.myfirstproject D/My2Fragment-TEST: onViewStateRestored
2021-08-07 11:09:22.346 7806-7806/com.example.myfirstproject D/My2Fragment-TEST: onStart
2021-08-07 11:09:22.347 7806-7806/com.example.myfirstproject D/My2Fragment-TEST: onResume

上面需要注意的地方我已经用空行分隔开了,注意看使用Replace添加Fragment2,Fragment1走了销毁onDestroyView的生命周期。

也就是:replace相比如add,replace之前的fragment是走的销毁生命周期。

二.Fragment与Activity数据通信

1.Activity向Fragment传输数据

有两种方式,如下代码注释所示:

MyFragment fragment = new MyFragment().newInstance("hello"); // 方式一
Bundle bundle = new Bundle();
bundle.putString("key", "你好"); //方式二
fragment.setArguments(bundle);

2.Fragment向Activity传输数据

定义一个接口:

public interface SetData {
    void setKey(String key);
}

Fragment中声明接口SetData:

private SetData listener;

//-------------

listener= (SetData)context;

//---------------

listener.setKey("你也好");

Activity实现(implements)该接口SetData:

public class MainActivity extends BaseActivity implements SetData{
    
    
    @Override
    public void setKey(String key) {
        Log.d("MainActivity======",key);
    }

}

也就是采用接口回调方式。

当然,我们也可以使用EventBus,LiveDataBus等相关框架来实现应用内通信。


以上就是关于Fragment生命周期以及通信的知识点概括。

附上一副关于 Fragment与Activity交互生命周期 网络图:

Fragment与Activity交互生命周期.jpg