Context在android中的作用不言而喻,当我们访问当前应用的资源时,启动一个新的Activity的时候都需要提供Context,而这个Context到底是什么呢。从字面意思是“上下文”,或者也可以叫做环境,场景等,尽管如此,还是有点抽象,从类的继承来说。Context作为一个抽象的基类,它的实现类有

直接子类有ContextImpl,ContextWrapper,MockContext
ContetxImpl和ContextWrapper是继承Context,但是Context抽象方法是在ContextImpl中实现的,ContextWrapper虽然也继承了Context但是其中的方法实现都是交由ContextImpl去完成的。ContextWrapper只是ContextImpl的包装类。
ContetxThemeWrapper,Service,Application都继承了ContextWrapper,所以它们也可以使用mBase调用Context中的方法,它们也是ContextImpl的包装类。
我们再看ContextWrapper的子类有Application,ReceiverRestrictedContext,Service,ContextThemeWrapper,等等

再看ContextThemeWrapper的子类最重要的Activity。

为什么通过任意的Contxet访问资源所得到的都是同一套资源? getApplication和getApplicationContext有什么区别呢?应用中有多少个Context呢?我们一一来分析下:
什么是Context
Context是一个抽象基类,我们通过它访问当前包的资源(getResources,getAssets)和启动其他组件(Service,Broadcast)以及得到各种服务(getSystemService),当然,通过Context能得到的不仅仅只有这些内容,对Context的理解可以来说:Context提供了一个应用的运行环境,在Context的大环境里,应用才可以访问资源,才能完成和其他组件,服务的交互,Context定义了一套基本的功能接口,我们可以理解为一套规范,这套规范实际是被ContextImpl类统一实现的,Activity和Service只是继承并有选择性地重写了某些规范的实现。
Application,Activity和Service作为Context的区别:
首先看下它们的继承关系:选中Service,按下F4键

Activity的继承关系图:

Application的继承关系图:

通过对比可以清晰地发现,Service和Application的类继承关系比较像,而Service和Application还多了一层继承ContextThemeWrapper,这是因为Activity有主题的概念,而Service是没有界面的服务,Application更是一个抽象的东西。
Context的真正实现类都在ContextImpl中,也就是说Context的大部分实现方法调用都会跳转到ContextImpl中,而Service和Application,Activity三者的创建均在ActivityThread中完成,从Activity的启动流程可以了解到,Activity的启动核心过程是在ActivityThread中完成的,这里说明的是,Application和Service的创建也是在ActivityThread中完成的,下面我们来看看三者在创建时是怎么和ContextImpl相关联的。

ActivityThread中的performLaunchActivity方法


可以看出,Activity在创建的之前会new一个ContextImpl对象并在attach方法中关联它。
下面继续看Application对象中ContextImpl的创建:
我们一般通过getApplicationContext来获取系统全局的Application Context,那么Application Context是在哪里创建的呢?
这就要从应用的启动开始,APP启动会调用ActivityThread的内部类ApplicationThread的scheduleLaunchActivity方法来启动
在ApplicationThread的scheduleLaunchActivity方法中向H类发生LAUNCH_ACTIVITY类型的消息,目的是将启动Activity的逻辑放在主线程的消息队列中,这样启动Activity的逻辑会在主线程中执行,在handleMessage()中调用ActivityThread#handleLaunchActivity()
这个又会调用ActivityThread#performLaunchActivity()

会继续调用LoadedApk#makeApplication

分析1语句 创建ContextImpl的对象,其内部之间通过new ContextImpl()进行创建
分析2语句 通过Instrumention的newApplication()创建Application。
分析3语句 将刚创建的Application类型app赋值给LoadedApk类中的成员变量mAppliction,getApplicationContext方法返回就是这个mApplication。
接下来继续分析Instrumention#newApplication()方法

继续看是 getFactory(context.getPackageName()).instantiateApplication(cl, className);去生成Application

可以看到最终是通过反射创建的,再回过头来看Instrumention.newApplication(),在Application创建完成后调用了Application的attach()

继续看Application的attach方法

里面又调用了父类ContextWrapper的attachBaseContext(context)方法,

这样就把刚创建的ContextImpl对象赋值给了ContextWrapper中的mBase。
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5
由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A
我很难理解Ruby中sender和receiver的实际含义。它们一般是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的调用。但是,我知道我的理解还远远不够。谁能给我一个Ruby中发送者和接收者的具体解释? 最佳答案 面向对象中的一个核心概念是消息传递和早期概念化,这在很大程度上借鉴了计算的Actor模型。艾伦·凯(AlanKay)创造了面向对象一词并发明了最早的OO语言之一SmallTalk,他拥有voicedregretatusingatermwhichputthefocusonobjectsinsteadofo
rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:
目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标