你真的理解 Android 中的 Context 么?

  • 时间:
  • 浏览:0
  • 来源:大发5分3DAPP下载_大发5分3DAPP官方

不可能 那末人问,那Fragment也是吗?看一下Fragment.onCreateView中参数有LayoutInflater,跟踪一下



在使用getContext辦法 的也不 有那末想过,在不同的场景下,取到的Context到底有哪此不同,View,Fragment,Activity和Application的getContext又究竟是为社 样?

有过后对于xml也不 的布局文件底下的View又是为社 样的呢?

Activity.setContentView -> PhoneWindow.setContentView -> LayoutInflater.inflate辦法 ,而你这俩LayoutInflater是在PhoneWindow的构造辦法 内创建的,回到Activity.attach辦法 ,就看构造辦法 的参数是Activity的Context。

结论也是Activity的Context。

追踪一分类整理现Context构建一定会ContextImpl类内,Application对应createAppContext,而Activity则对应createActivityContext,一定会ActivityThread中调用个人创建Context辦法 进行初始化。

看一下Activity.setContentView辦法 的调用过程是:

本文作者:豆沙包67

本文来自云栖社区企业商务合作伙伴“安卓巴士Android开发者门户”,了解相关信息还才能关注“安卓巴士Android开发者门户”。

Fragment.onCreateView <- Fragment.performCreateView -> FragmentManagerImpl.moveToState <- Fragment.performGetLayoutInflater <- Fragment.getLayoutInflater <- FragmentHostCallback.onGetLayoutInflater

发现是入参Context,在inflate辦法 内赋值,我觉得最后也不 LayoutInflater.from的参数Context。

取到的是Application Context。



DecorView

对于Application的Context而言,在整个应用的生命周期内一定会会改变;而对于不同的Activity,其Context有不可能 不同,之类添加有一个Dialog都要附着在Activity上,全都使用Application就会报错。

对比ContextImpl的构建,前有一个参数都一致,Activity的Context多了activityToken和classLoder,其中activityToken对应ActivityRecord类,接着调用Context.setResource辦法 设置Activity的配置和逻辑显示相关的信息Display。

Fragment

全都最终的目的是区分Application与Activity的Context有哪此不同。全都看它们个人的实现,Application与Activity都继承于ContextWrapper,ContextWrapper也不 包装了一下抽象类Context,在构造辦法 里传入Context对象,根本在于构建Application和Activity的地方。

下面来分析一下。



全都结论是普通View是LayoutInflater.from的参数Context。

于是增加有一个结论,在xml中解析的View的Context属于Activity。

两者之间更重要的有一个区别是:生命周期。



获取Context





概述

结果是用了FramgentHostCallback构造辦法 的参数Context

一般View是从LayoutInflater类中inflate生成的,查看inflate辦法 ,会调用rinflate

ActivityThread.addView -> PhoneWindow.generateDecor

Application

DecorView的Context是Application Context。

一般来说,Application Context所处于整个应用的生命周期中,不用随场景变化而改变,全都对于打开不同的Activity,Activity Context不可能 所处不同,有过后生命周期跟Activity的生命周期一致。

Applicaiton与Activity的区别

通过Fragment.getContext取到Context,结果是取到FragmentHostCallback.getContext也是Activity的Context。

除了Application,DecorView和getApplicationContext辦法 会取到Application Context外,有些辦法 getContext一定会取到Activity Context不可能 传入的Context。



原文发布时间为:2018-11-22

看一下你这俩熟悉的错误,你这俩是使用Application的Context启动Activity时报的错误,你这俩mSourceRecord也不 AcitivityRecord对象,对于Application而言为null,全都都要指定New_Task你这俩标志。

FragmentActivity

一般使用FragmentActivity.this和FragmentActivity.getContext辦法 取到Context,最终取到的一定会Activity的Context,不再赘述。