Fragment 与 Service| 青训营笔记

460 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第6天

Fragment 轻量级界面容器

有着碎片化的特性,相比 Activity 速度较快(因为 Activity 启动要走 RPC)

基本用法
  1. 创建 Fragment 布局文件

  2. 创建 Fragment 子类,加载布局文件

  3. Activity 加载 Fragment

    1. 静态加载:布局中绑定
    2. 动态加载:FragmentManager加载

Fragment生命周期.png

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 交互

组件获取

  1. Fragment 获取 Activity 中的组件:getActivity().finViewById(R.id.xxx)
  2. Activity 获取 Fragment 中的组件:getFragmentManager.finFragmentById(R.id.fragment_xxx)

数据传递

  1. Activity 传数据给 Fragment:setArguments(Bundle bundle)

  2. Fragment 传数据给 Activity:

    1. 通过对象直接传递(方法调用/接口调用)
    2. 通过 viewmodel/handler/braodcast/eventbus 等通信
Fragment 总结

Fragment总结.png

服务组件 Service

基本用法
  1. 注册:AndroidManifest中使用 <service.../> 标签
  2. 创建:建立相应的 Service 实现类
  3. 加载:startService() / bindService()
生命周期

Service生命周期.png

与 Activity 通信
  1. 定义 Binder 子类,并实现 getService() 方法,返回 Service 对象。
  2. 实现 Service 类 onBInd() 方法,返回上述 Binder 对象。
  3. 实例化 ServiceConnection 对象,实现 onServiceConnected() 方法,从中获取到 Service 实例。
  4. Activity 中调用 bindService() 方法,并传递步骤3中获取到的 ServiceConnection 对象,将流程跑起来。
  5. Activity 通过调用 Service 实例中的方法进行直接通信。