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。
版权声明:本文为博主原创文章,未经博主允许不得转载。

framework之 ContextImpl文件解析

ContextImpl Context的实现
  • ahjxly
  • ahjxly
  • 2014年03月08日 17:39
  • 6018

自定义View 拓展view 没有全部实现夫view中的构造方法 ApplicationContext is null in ApplicationStatus

报以下的错误:01-08 17:22:33.223: E/AndroidProtocolHandler(17352): Unable to open asset URL: file:///androi...

android学习—— context 和 getApplicationContext()

在android中常常会遇到与context有关的内容 浅论一下context : 在语句 AlertDialog.Builder builder = new AlertDialog.Builder...

Spring中BeanFactory和ApplicationContext的区别

spring中BeanFactory和ApplicationContext的区别。

Spring中ApplicationContext和beanfactory区别

BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP...
  • hi_kevin
  • hi_kevin
  • 2012年03月06日 16:58
  • 30919

Spring的applicationContext.xml和dispatcher-servlet.xml的区别

大家知道, 在spring mvc中, 在applicationContext.xml 和 dispatch-servlet.xml中都可以进行spring 的配置, 那么他们有什么区别呢: 我们先...

Spring 学习手札(三)BeanFactory与ApplicationContext的区别

一、基础介绍: 1、在Spring中,组件无需自己负责与其他组件的关联。取而代之的是,容器负责把协作组件的引用给予各个组件。创建系统组件之间协作关系的这个动作是DI的关键,通常被称之为装配; 2、...

ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别

spring通过在web.xml 中配置ContextLoaderListener 来加载context配置文件,在DispatcherServlet中也可以来加载spring context配置文件...
  • ichsonx
  • ichsonx
  • 2012年06月28日 13:36
  • 5561

Spring中BeanFactory和ApplicationContext的生命周期及其区别详解

Bean的生命周期在很多技术中,都有生命周期这个概念,如在Android中,有Activity、Fragment等的生命周期;在Web容器中,有Servlet的生命周期。想要成为高级开发者,就必须要深...

spring中通过ApplicationContext获取bean和通过bean工厂获取bean的区别

通过上下文容器获取bean的代码如下:  A
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ApplicationContext、ActivityContext、ViewContext和ContextImpl(BaseContext)的区别
举报原因:
原因补充:

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