位置: 编程技术 - 正文

Android Fragment 体系 源码追踪笔记(4)

编辑:rootadmin

推荐整理分享Android Fragment 体系 源码追踪笔记(4),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

FragmentState implements Parcelable, 这个就没啥多说的了,就是就一个Fragment 信息的holder,在 onSave/RestoreInstance时使用(不过可以了解一下整个Fragment体系的state的save/restore流程).

再重申一下Fragment的6个状态(Fragment其实完全就是一个状态机):

INITIALIZING = 0; (构造出来时的默认初始状态)CREATED = 1;ACTIVITY_CREATED = 2;STOPPED = 3;STARTED = 4;RESUMED = 5;

捋一遍内部成员变量:其实有很多在上一篇分析FragmentManager的时候已经清楚了:

mAnimatingAway:注释说的很清楚了,我们要移除Fragment的View,但是呢,这个移除过程有动画,那么显然不能直接就把View释放,这时候就会用这个mAnimatingAway保存View,在动画完了以后,会通过此引用来处置View.mStateAfterAnimating: 跟mAnimatingAway绑定的,看FragmentManager的moveToState时就可以看到,在moveToState时,如果有动画或者正在动画,那么其实State是不会move的,而是会把要move的下一个state保存在这个变量中,在动画完了以后会根据这个state来真正的moveToState.mSavedFragmentState: instantiated from saved state,使用此state.SparseArray mSavedViewState: 一个Fragment的View里一般会有别的childView,那么显然这些View也是需要save/restore state的,这个Parcelable数组就是一个holder.mIndex = -1: fragment在FragmentManager中的mActive中的indexmWho: Internal unique name for this fragmentBundle mArguments: 构造时传入的参数,setArguments(…)mTarget, target fragment,这个主要用于fragment之间的交互, setTargetFragment(…)的注释: This may be used, for example, if this fragment is being started by another, and when done wants to give a result back to the first. mTargetIndex/mTargetRequestCode配套使用mAdded: 是否在FragmentManager的mAddedmRemoving:是否正在被从Activity removingmResumed:是否在resumed 状态.mFromLayout,该Fragment是否是从layout文件中实例化的.mInLayout: 感觉和mFromLayout一样?mRestored:是否已经从之前save的state中restore了.mBackStackNesting;该fragment所在的backStack的backStackEntry的数量.mFragmentManager/mActivity/mChildFragmentManager不解释了mFragmentId:一个可选的id.mContainerId: fragment的View的containerVie的Id.mTag:可选的tag. 跟View的tag角色差不多mHidden, 在app 请求将这个fragment从用户那里隐藏时是true(注释的语义不是很清晰)mDetached: fragment 是否 deactivated.mRetainInstance: 在configuration的change时,是否会被retain(冷门的一个选项).mHasMenu: 主要是用于fragment切换对ActionMenu的动态改变.mCalled: Used to verify that subclasses call through to super class. 多层类结构上的一个Flag.mNextAnim,指的就是app自定的Animation,但是从FragmentManager的loadAnimation(…)逻辑看,如果调用者自己在onCreateAnimation(…)返回了别的Animation, mNextAnim就没用了. mContainer:从注释(The parent container of the fragment after dynamically added to UI.)看,感觉就是containerView,不过这里是一个ViewGroup引用.mView:就是fragment 放在container的view.mInnerView:这个和mView的区别在FragmentManager里说过,mView有时候其实是在Fragment create的View外边wrap了一层view,这个View会变为mView,而被包住的View则变为mInnerViewmDeferStart:标注该fragment是不是应该defer自己的start直到其他的fragment已经start并且loader也就绪了,个人感觉没准可以作为一个delay init的优化手段使用.mUserVisibleHint: Hint provided by the app that this fragment is currently visible to the user.mLoaderManager/mLoadersStarted/mCheckedForLoaderManager:这几个是为了支持在fragment使用android的loader机制.

Fragment():空的Fragment构造函数,很重要,因为需要这个无参的构造函数来在从activity的savedstate中restore构造出fragment实例.并且注释也建议Fragment的子类不要自己做死增加其他的需要参数的构造函数,因为这些构造函数在fragmentre-instantiated是不会被调到的,会悲剧,,建议使用setArguments()/getArguments()来实现同样效果.

static Fragment instantiate(Context context, String fname, Bundle args): 用反射的办法构造一个fname(类名)指定的Fragment类,后面的args会在构造完以后设置给fragment实例的mArguments,注意这里反射时调用的是Class的newInstance(),也就是说这货调的也是Fragment类的无参构造函数,便利性工具函数.

setIndex(int index, Fragment parent):指定mIndex, 另外顺带把mWho赋值,注意这里的Fragment parent,一个Fragment是可以做另外一个fragment的parent的,如果有parent: mWho = parent.mWho + “:” + mIndex;,否则:mWho = “android:fragment:” + mIndex;.

isInBackStack():看一下的当前所在的backStack的entryNum(mBackStackNesting)是不是>0,当前了如果就不在backstack,那么mBackStackNesting应该就是默认的0.

getId()->mFragmentId/getTag()->tag

setArguments(Bundle args):一个注意点,如果mIdex已经>=0了,那么就不能set了,会抛异常 注释有说: This can only be called before the fragment has been attached to its activity, 所以应该在构造完fragment以后就立刻set,mArguments的生命周期会贯穿fragment的创建和销毁.

getResources(): 便利性封装函数,取得还是所在的Activity的getResources(),如果还没有attach到某个Activity,会抛异常.

getText(int resId)/getString(int resId)/…..,和上面一样的便利封装.

getFragmentManager():注意在fragment被加入到fragmentTransaction直到被commit和attach到Activity这个期间,有可能是null,fragmentManager的code也可以看出来,是在FragmentManager的moveToState的case Fragment.INITIALIZING下才会设置fragmengt的mFragmentManager.

isAdded() -> mActivity != null && mAdded

isDetached()->mDetached, FragmentTransaction的detach会导致这个状态.

isRemoving(): 跟所在的Actiivty是不是finishing无关,就是指的是fragment现在正在被removing

isVisible(): This means it:

(1) has been added(2) has its view attached to the window(3) is not hidden.

setRetainInstance(boolean retain):注释里解释了,这个fragment的实例使命周期是否可以脱离其所在Activity的销毁和重建的生命周期. 注意在backStack中的fragment不能设置这个flag,设了之后:

onDestory()不会被调用,但是onDetach还是会被调用.onCreate()不会再被调用.onAttach(Activity)/onActivityCreated(Bundle)还会被调用.s

getLoaderManager():逻辑:

如果mLoaderManager本身不是null, return.否则尝试从Activity去取(使用了mWho),mActivity.getLoaderManager(mWho, true, true); mCheckedForLoaderManager也会设为true.Android Fragment 体系 源码追踪笔记(4)

startActivity(…)/startActivityForResult(…)/…便利性封装.

onActivityResult(…):相对的回调,Activity那里应该做了下发.

getLayoutInflater(…):便理性封装.

onInflate(…):针对的是在layout文件中声明的fragemnt,注释值得好好看看.

onCreate(Bundle savedInstanceState): 在onAttach和onCreateView之后,注意,这个回调的时候,fragment所在的Activity可能还在create中,因此这时候不能假设Activity的content view已经初始化构建完成, onActivityCreated(…)就是为此存在的.

void onViewCreated(View view, Bundle savedInstanceState): 注释说在onCreateView之后立即被调用,但是如同之前分析FragmentManager时,两个回调中间还是有间隔的,比如wrap,这给子类提供了一个机会在自己的View已经被create的时候,不过fragment的view这时候还没有被attach到parent上

onActivityCreated(Bundle savedInstanceState): 在fragment所在的Activity已经create并且fragemnt的View 结构也已经被初始化了,这个callback告知了fragment已经与Activity对象充分关联了,在onCreateView之后和onViewStateRestored之前调用.

onViewStateRestored(Bundle savedInstanceState),在fragment中的View已经restore state时会被调用.这一步之后才能检测View的一些自己的会被save/restore的state.比如是否checked,这个flag只有在这个时候以后后面才是有效的

onStart():fragemnt对user可见时被调用,一般是直接绑定在Activity的onStart()上的. 这一步还会把fragment的LoadManager start(可见在pasue状态下,loadManager是不work的)

onSaveInstanceState(Bundle outState): 在被系统回收时,用来保存fragment自己的state信息,以再后面restore重建,和Activity的差不多.

onDestroyView():说了一个关键信息:在fragment的view被detachfrom fragment的时候会被调用,下次fragment再展示,就会new一个新的View,在onStop和onDestroy之间,在对FragmentManager的分析中,可以看到,在fragment moveToState的state是早于 Fragment.ACTIVITY_CREATED时,会调用performDestroyView()->onDestroyView()

Fragment的所有onXXX函数本身是作为回调的,因此里面不会有多少操作,而performXXX会执行操作,并调用onXXX, performXXX其实做的主要操作是对ChildFragment的动作下发(如果有childFragment的话)

performDestroy(): 如果本身自己还有childFragment,那么会调用mChildFragmentManager.dispatchDestroy()将destroy传递下去.

registerForContextMenu/unregisterForContextMenu: 为某个View注册一个ContextMenu create的Listener.

onContextItemSelected:在context menu的某一个item被选中时的回调.

performCreate(Bundle savedInstanceState),除了调用自己的onCreate(会传入savedInstanceState)以外,主要是将savedInstanceState分发给childFragment(如果有的话).

performStart():除了onStart回调和childFragment动作下发外,还会调用mLoaderManager.doReportStart(),而mLoaderManager的start则是在onStart被调用

performReallyStop():与performStop()的不同在于对loader的处理,在获取了LoaderManager以后,如果Activity不是Retaining的,那么mLoaderManager.doStop()否则mLoaderManager.doRetain().

performDestroyView():mLoaderManager会doReportNextStart()

上面这些分析给我的感觉就是Fragment本身在Fragment这个体系中其实是一个轻量化的角色(当然了,一系列callback会将其填充),系统本身的Fragment实现一个作用是建立了Fragment这个概念,使其可以被Manage以及save/restore,同时负责了loaderManager的交互与维护以及对所依附的Activity一些操作封装.

Loaders 异步加载数据(一) 关于LoadersLoaders是Android3.0添加进来的,Loaders让在Activity和Fragment之间加载数据变的很简单。Loaders有一下几个特性:在任何Activity或者Fragment中都是有效的

Android Volley 框架的使用(一) AndroidVolley框架的使用(一)由于这部分内容较多,所以打算分成几个部分来写,这篇文章主要是从整体上介绍Volley框架的基本使用;为什么要使用Volley

Android--VideoPlay--视频播放器 代码跟音乐播放器有大部分是相同的,各位可以将mp4格式的视频文件放到sdcard卡中,在输入框中输入文件名即可,在模拟器上运行请使用android2.0版本,

标签: Android Fragment 体系 源码追踪笔记(4)

本文链接地址:https://www.jiuchutong.com/biancheng/382249.html 转载请保留说明!

上一篇:[置顶] Android Listview的使用([置顶]从lv2开始开挂的原勇者候悠闲的异世界生活)

下一篇:Loaders 异步加载数据(一)(异步加载场景)

  • 税务申报退税
  • 审核记账对账结果怎么写
  • 公司购买了地板可以退吗
  • 企业所得税怎么缴纳
  • 收到固定资产发票抵扣进项税
  • 门票可以直接入账吗
  • 发票可用时间
  • 加计抵减申报表填写说明
  • 结转周转材料成本分录
  • 增值税进项加计扣除计入哪个科目
  • 出口货物当期免抵退税不得免征和抵扣税额,应计入
  • 视同销售要确认收入吗?
  • 货物尾款优惠如何计算
  • 收到总公司投资款怎么做账务处理
  • 其他公司向本企业借款
  • 城镇土地使用税征收标准及计算方法
  • 税务季报都报啥
  • 2020年资金账簿印花税最新规定
  • 税控盘怎么使用
  • 迁出注销类别怎么写
  • 计提无形资产累计摊销9083.33
  • 地税退税怎么做分录
  • 增值税即征即退会计处理
  • 零余额账户用款额度年末转入什么科目
  • 办公室装修费用计入什么会计科目
  • 认证成功次月何时补发
  • 商务平台建设
  • linux批量操作工具
  • win10开机内存占用60% 8g占用过高
  • 期间费用包括哪几个科目
  • php apc
  • 银行存款期末调汇吗
  • 根据新企业所得税法的规定,企业购买并实际使用
  • 销售产品库存商品怎么减
  • Windows 11 CO-21H2 22000.194 正式版官方下载地址(附esd微软三语直链下载x64+arm64)
  • 租金收入计入收入总额吗
  • three.js 教程
  • 税款滞纳金会计处理
  • 用php制作年历
  • 试生产产品计入研发费用吗
  • 织梦怎么调用当前栏目下的文章
  • 帝国cms商城教程
  • 管理不善的进项税额去了哪里
  • 利润分配未分配利润期末有余额吗
  • 购进运输服务取得的成果
  • 结转本年利润的摘要怎么写
  • 被投资单位信息是什么
  • 公司在建厂房图片大全
  • 存货的进口关税计入成本吗
  • 净利润增长率计算方式
  • 应收账款周转率范围多少合适
  • 无形资产计入待摊费用
  • 什么是增值税
  • sql server数据库查询语句
  • Linux/Mac MySQL忘记密码怎么办
  • win7如何共享文件夹给另一台电脑使用
  • ubuntu一键重装
  • 桌面快捷方式不显示图标怎么办
  • Linux系统网络配置
  • 双系统计算机怎么开机
  • 服务器centos6.8安装教程
  • explorer.exe进程在哪
  • win7精简版安装net4.0
  • win8分屏快捷键
  • linux scp命令的用法详解
  • centos支持中文
  • win8.1屏幕键盘
  • win8.1拨号上网
  • linux防火墙的主要内容
  • win10系统打开安装程序没反应
  • java物流功能
  • sed查找字符串
  • AddForceAtPosition方法:增加刚体点作用力
  • bootstrap入门教程
  • jquery json对象
  • shell脚本关闭指定程序
  • 百旺税控盘电话服务热线
  • 积极配合税务局工作
  • 特价机票包含燃油费和机场建设费吗
  • 外地人在上海奉贤区买房需要什么条件
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设