Android编程权威指南--CriminalIntent笔记及拓展(一)

来源:互联网 发布:python 3.2.5.msi下载 编辑:程序博客网 时间:2024/05/21 18:43

Fragment的生命周期

这里写图片描述

  1. 使用fragment的前提是,activity知道如何管理fragment,FragmentActivity类知道如何管理支持版本的fragment.
  2. Fragment生命周期与activity生命周期的一个关键区别,fragment的生命周期方法是由托管activity而不是操作系统调用,操作系统不关心activity用来管理视图的fragment,fragment的使用是activity内部的事情.
  3. 托管的两种方式
    • 使用布局fragment,简单但是不够灵活,在activity布局中添加fragment,就等同于将fragment及其视图与activity的视图绑定在一起,并且在activity的生命周期过程中,无法切换fragment视图
    • 比较复杂,但是也是唯一可以在运行时控制,fragment的方式,.自行决定何时添加fragment以及随后可以完成何种具体任务,也可以移除fragment,用其他fragment代替,然后重新添加已移除的fragment
  4. Fragment.Create(Bundle)是公共方法Activity.onCreate(Bundle)是保护方法.Fragment.oncreate方法以及其他Fragment生命周期方法必须是公共方法,因为托管fragment的activity要调用它们

    这里写图片描述

  5. Activity的FragmentManager负责调用队列中fragment的生命周期方法.添加fragment供fragmentManager管理时,onAttach(Activity),oncreate(),onAcivityCreate()方法也会被调用
  6. 在activity处在运行状态时,添加fragment, FragmentManager立即驱使fragment行动,执行必要方法, 与activity的最新状态保持同步,一旦fragment的状态与activity的状态保持了同步,托管activity的FragmentManager就会边接收操作系统的调用指令,边调用其他生命周期方法,以保持fragment与activity的状态一致

inflater方法流程及使用

这里写图片描述
1. 函数首先通过最初的tag创建了RelativeLayout的view, 然后调用了rInflate方法,传入的参数为(parser, parent=RelativeLayout, attrs);
2. 进入rInflate方法后,由于imageview1和textview1没有子结构,所以递归调用rInflate的时候会遇到type==XmlPullParser.END_TAG的终止条件
3. 但是,继续向下解析的时候,到LinearLayout就不一样了. LinearLayout递归调用rInflate的时候,会把自己作为parent传入,导致解析ImageView2和TextView2的时候,均为add到LinearLayout上。最后,LinearLayout再被add到最外层root节点RelativeLayout上。

延伸attachToRoot参数的作用
1. 如果root为null,attachToRoot将失去意义,设置任何值都没意义
2. 如果root不为null,attachToRoot为true,则会给加载的布局文件指定一个父布局,即root
3. 如果root不为null,attachToRoot为false*,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效*
4. 在不设置attachToRoot参数时,当root不为null,attachToRoot默认为true
这里写图片描述

FragmentManager

这里写图片描述

  1. Fragment事务由FragmentManager控制
  2. Fragment事务被用来添加,移除,附加,分离,替换fargment队列中的fragment,这是使用fragment在运行时组装和重新组装用户界面的关键,FragmentManager管理着fragment事务回退栈
  3. FragmentManager使用FrameLayout组件的资源id去识别crimeFragment,可能看起来有点怪,但实际上,使用容器资源id去识别fragment是FragmentManager的内部实现机制.如果要想activity添加多个fragment,通常需要分别为每个fragment创建不同的id容器
  4. 使用R.id.fragment_container的容器视图资源id,向FragmnetManager请求并获取fragment.如果要获取的fragment已存在队列中,就直接返回.
  5. 为什么要获取的fragment会存在与这个队列中,设备旋转或回收内存时,android会销毁CrimeActivity,而后重建时,会调用CrimeActivity.onCreate()方法,activity销毁的时候FragmentManager会将fragment队列保存下来.
  6. 另一方面,如果指定容器视图资源ID的fragment不存在,则fragment变量为空值,这时新建CrimeFragment,并启动一个新的fragment事务,将新建fragment添加到队列中

为什么应优先使用支持库版fragment

因为要升级支持库版fragment的话,我们只需要下载升级包,重新编译发布一个新版本应用就行google每年会多次更新支持库,并且借此引人新特性,修复享受这些好处,只需要升级项目的支持库版本即可

0 0
原创粉丝点击