这是我参与「第四届青训营 」笔记创作活动的第6天
Fragment 轻量级界面容器
有着碎片化的特性,相比 Activity 速度较快(因为 Activity 启动要走 RPC)
基本用法
-
创建 Fragment 布局文件
-
创建 Fragment 子类,加载布局文件
-
Activity 加载 Fragment
- 静态加载:布局中绑定
- 动态加载:FragmentManager加载
Fragment 和 Activity 相比多了几个方法
onAttach() Fragment 和 Activity 建立关联时调用(Activity 传递到此方法内)
onCreateView() 当 Fragment 创建视图时调用
onActivityCreated() Activity 的 onCreate() 方法已返回时调用
onDestroyView() 当 Fragment 中的视图被移除时调用
onDetach() Fragment 和 Activity 取消关联时调用
常用场景下生命周期流转:
1 启动:onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume() - Resumed
2 退出:Resumed - onPause() - onStop() - onDestoryView() - onDestory()
3 部分覆盖:Resumed - onPause() - Paused
4 部分遮挡恢复:Paused - onResume() - Resumed
5 完全覆盖:Resumed - onPause() - onSaveInstanceState() - onStop() - Stoped
6 完全遮挡恢复:Stoped - onStart() - onResume() - Resumed
7 后台回收:Stoped - Killed
8 回收恢复:Killed - onCreate() - onStart() - onRestoreInstanceState()- onResume() - Resumed
注:Fragment生命周期可通过FragmentTransaction.setMaxLifecycle()手动干预
Fragment 与 Activity 交互
组件获取
- Fragment 获取 Activity 中的组件:getActivity().finViewById(R.id.xxx)
- Activity 获取 Fragment 中的组件:getFragmentManager.finFragmentById(R.id.fragment_xxx)
数据传递
-
Activity 传数据给 Fragment:setArguments(Bundle bundle)
-
Fragment 传数据给 Activity:
- 通过对象直接传递(方法调用/接口调用)
- 通过 viewmodel/handler/braodcast/eventbus 等通信
Fragment 总结
服务组件 Service
基本用法
- 注册:AndroidManifest中使用 <service.../> 标签
- 创建:建立相应的 Service 实现类
- 加载:startService() / bindService()
生命周期
与 Activity 通信
- 定义 Binder 子类,并实现 getService() 方法,返回 Service 对象。
- 实现 Service 类 onBInd() 方法,返回上述 Binder 对象。
- 实例化 ServiceConnection 对象,实现 onServiceConnected() 方法,从中获取到 Service 实例。
- Activity 中调用 bindService() 方法,并传递步骤3中获取到的 ServiceConnection 对象,将流程跑起来。
- Activity 通过调用 Service 实例中的方法进行直接通信。