【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

ApplicationContext、ActivityContext、ViewContext和ContextImpl(BaseContext)的区别

原创 2015年11月21日 12:31:53

ContextWrapper

  • ContextWrapper 是 ContextImpl(也就是BaseContext) 的包装,所有对 ContextWrapper 的操作都会用代理到 BaseContext 上。
  • Application和Activity和Service都继承自ContextWrapper
  • android.content.ContextWrapper#getApplicationContext 获得Application实例,和Application.this 是同一个对象。因此Activity.getApplicationContext == Application.getApplicationContext == Service.getApplicationContext == Application.this == Activity.getApplication
  • android.content.ContextWrapper#getBaseContext 都获得的是ContextImpl对象。

Application中BaseContext的创建过程:

  • android.app.LoadedApk#makeApplication,首先判断Application实例是否存在,如果存在则直接返回,不存在继续下面步骤。
  • 首先调用 android.app.ContextImpl#createAppContext 创建一个ContextImpl实例;
  • 调用 android.app.Instrumentation#newApplication 创建一个Application实例;
  • 调用 android.app.Application#attach->android.content.ContextWrapper#attachBaseContext 为Application的BaseContext赋值;
  • 最后调用 android.app.ContextImpl#setOuterContext 将Application实例赋值给ContextImpl的mOuterContext,这个mOuterContext的作用:
    • startActivity时,如果是ActivityContext的话,就不需要加 FLAG_ACTIVITY_NEW_TASK 标记之类的
    • 创建部分SystemService(如:android.content.Context#NOTIFICATION_SERVICE)时,也会用到mOuterContext。具体参考ContextImpl的static块。
  • 因为一个进程中只会有 Application的一个实例,因此Application的BaseContext也只会存在一个。

Activity的BaseContext的创建过程:

  • android.app.ActivityThread#performLaunchActivity
  • android.app.Instrumentation#newActivity 创建Activity实例,直接调用Activity的无参构造
  • android.app.ActivityThread#createBaseContextForActivity 为Activity创建BaseContext。
  • android.app.ContextImpl#createActivityContext 创建ContextImpl实例
  • 设置ContextImpl的OuterContext为Activity
  • android.app.Activity#attach->android.content.ContextWrapper#attachBaseContext 为Activity的BaseContext赋值;
  • 因此Activity的BaseContext每次都是新的。

Service的BaseContext的创建过程:

参考:android.app.ActivityThread#handleCreateService 和Activity类似,同样每次BaseContext都是新的。

ViewContext

参考:android.view.LayoutInflater#createViewFromTag
如果ViewParent使用了不同的Theme之类的,就会和ViewParent使用同一个Context,否则使用 LayoutInflater 实例化时的Context,不过一般ViewContext == Activity.this。ViewContext不可能是ContextImpl,因为在ContextImpl对LAYOUT_INFLATER_SERVICE的获得是通过getOuterContext,也就是获得的是Activity,Service或Application。

总结:

  • android.content.ContextWrapper#getBaseContext 都获得的是ContextImpl对象。
  • Activity.getApplicationContext == Application.getApplicationContext == Service.getApplicationContext == Application.this == Activity.getApplication
  • Application的BaseContext只会存在一个,而Activity和Service的BaseContext每次都是新的.
  • 通常情况下 ViewContext == Activity.this,特殊情况比如:使用LayoutInflater.from(ApplicationContext) inflate的View的ViewContext == Application.this。ViewContext不可能是ContextImpl。
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Android Context完全解析,你所不知道的Context的各种细节

Context相信所有的Android开发人员基本上每天都在接触,因为它太常见了。但是这并不代表Context没有什么东西好讲的,实际上Context有太多小的细节并不被大家所关注,那么今天我们就来学...

Android中Context详解 ---- 你所不知道的Context

本文原创 ,转载必须注明出处 :http://blog.csdn.net/qinjuning                  前言:本文是我读《Android内核剖析》第7章 后形成的读书笔记...

Spring中ApplicationContext和beanfactory区别

BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP...

ApplicationContext与BeanFactory区别:

BeanFactory提供的最基本的Ioc容器的功能,关于这些功能定义,我们可以在接口BeanFactory中看到。BeanFactory接口定义了Ioc容器最基本的形式,并且提供了Ioc容器所应该遵守的最基本的服务契约,同时,这也是我们使用Ioc容器所应遵守的最底层和最基本的编程规范,这些接口定义勾画了Ioc的基本轮廓。BeanFactory只是一个接口类,并没有给出容器的具体实现,比如DefaultListableBeanFactory、xmlBeanFactory、ApplicationContext等都可以看成是容器附加了某些功能的具体实现,也就是容器体系中的具体容器产品。 A

ApplicationContext和BeanFactory区别简析

其他BeanFactory接口的实现类,会延迟到调用getBean()方法时构造,ApplicationContext的初始化时间会稍长些,调用getBean()是由于Bean已经构造完毕,速度会更快...

Spring中的applicationContext.xml与SpringMVC的xxx-servlet.xml的区别

原文转自:http://blog.csdn.net/qq38397892/article/details/23821949 一直搞不明白两者的区别。 如果使用了SpringMVC,事实上,bean的配置完全可以在xxx-servlet.xml中进行配置。为什么需要applicationContext.xml?一定必须? 一、 因为直接使用了SpringMVC,所以之前一直不明白xxx-servlet.xml和applicationContext.xml是如何区别的,其实如果直接使用SpringMVC是可以不添加applicationContext.xml文件的。 使用appl

BeanFactory和ApplicationContext的区别

BeanFactory和ApplicationContext的区别   描述   BeanFactory: 是Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对...

spring中的BeanFactory与ApplicationContext的作用和区别?

1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能: <p

Spring中的applicationContext.xml与SpringMVC的xxx-servlet.xml的区别

一直搞不明白两者的区别。 如果使用了SpringMVC,事实上,bean的配置完全可以在xxx-servlet.xml中进行配置。为什么需要applicationContext.xml?一定必须? ...

spring applicationContext 和webApplicationContext 区别

          Spring中的ApplicationContexts可以被限制在不同的作用域。在web框架中,每个DispatcherServlet有它自己的WebApplicationContext,它包含了DispatcherServlet配置所需要的bean。DispatcherServle
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)