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 进容器。然后分别使用 Add 和Replace添加My2Fragment。然后观察MyFragment和My2Fragment各自生命周期变化。
先看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,Fragment1和Fragment2互不影响。
再看看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交互生命周期 网络图: