Android中Aplication中Context和Activity中的Context的异同

原创 2018年04月15日 09:59:32

一、Context是什么:
1、Context是维持Android程序中各组件能够正常工作的一个核心功能类,我们选中Context类 ,按下快捷键F4,右边就会出现一个Context类的继承结构图啦,如下图所示:


从源码中我们可以看见Context是个抽象类,里面定义了各种抽象方法,包括获取系统资源,获取系统服务,发送广播,启动Activity,Service等,结合上图也就是说Activity、Service、Application等都是Context类的一个实现。再仔细看一下上图:Activity、Service、Application都是继承自ContextWrapper(上下文功能的封装类),而在ContextWrapper的源码中我们可以看到,ContextWrapper内部会包含一个base context(这里就不贴出来了,大家去看源码即可),由这个base context去实现了绝大多数的方法。


通过继承关系可以看到,Context直接子类为MockContext(具体实现类)和ContextWrapper(上下文功能包装类),而ContextWrapper又有三个子类,分别是ContextThemeWrapper、Service和Application。基于Activity和Service、Application不在一个继承层级里,而是又继承了ContextThemeWrapper。细心的朋友看到ContextWrapper和ContextThemeWrapper这两个类的名字,相信你心里已经有了答案,对的,区别在Theme。ContextThemeWrapper是一个带主题的封装类,内部包含了主题(Theme)相关的接口,当Activity在启动的时候系统都会加载一个主题,也就是我们在配置文件AndroidManifest.xml里面写的android:theme=”@style/AppTheme”的属性啦!(如下图所示),可是Service和Applicaton并不需要加载主题,因此他们继承自ContextWrapper。

三、Application中的Context和Activity中的Context的区别
在需要传递Context参数的时候,如果是在Activity中,我们可以传递this(这里的this指的是Activity.this,是当前Activity的上下文)或者Activity.this。这个时候如果我们传入getApplicationContext(),我们会发现这样也是可以用的。可是大家有没有想过传入Activity.this和传入getApplicationContext()的区别呢?首先Activity.this和getApplicationContext()返回的不是同一个对象,一个是当前Activity的实例,一个是项目的Application的实例,这两者的生命周期是不同的,它们各自的使用场景不同,this.getApplicationContext()取的是这个应用程序的Context,它的生命周期伴随应用程序的存在而存在;而Activity.this取的是当前Activity的Context,它的生命周期则只能存活于当前Activity,这两者的生命周期是不同的。getApplicationContext() 生命周期是整个应用,当应用程序摧毁的时候,它才会摧毁;Activity.this的context是属于当前Activity的,当前Activity摧毁的时候,它就摧毁。

四、Application中的Context和Activity中的Context各自的使用场景
Activity Context 和Application Context两者的使用范围存在着差异,具体如下图所示:

我们就只看Activity和Application,可以看到前三个操作不在Application中出现,也就是Show a Dialog、Start an Activity和Layout Inflation。开发的过程中,我们主要记住一点,凡是跟UI相关的,都用Activity做为Context来处理。

五、Context数量
在创建Activity、Service、Application时都会自动创建Context,它们各自维护着自己的上下文。在Android系统中Context类的继承结构里面我们讲到Context一共有Application、Activity和Service三种类型,因此如果要统计一个app中Context数量,我们可以这样来表示:
Context数量 = Activity数量 + Service数量 + 1
这里要解释一下,上面的1表示Application数量。一个应用程序中可以有多个Activity和多个Service,但只有一个Application。可能有人会说一个应用程序里面可以有多个Application啊,我的理解是:一个应用程序里面可以有多个Application,可是在配置文件AndroidManifest.xml中只能注册一个,只有注册的这个Application才是真正的Application,才会调用到全部的生命周期,所以Application的数量是1。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010404906/article/details/79946879

什么是XForms?

什么是XForms?当前的Web表单的设计无法从表单的表述中分离表单的目的或用途,然而XForms, , 由分别描述表单行为和样式的独立单元组成,这就允许柔性表述选择, 包含经典的XHTML表单,附加...
  • FlySpace
  • FlySpace
  • 2003-05-17 17:29:00
  • 1511

Android 什么时候用Application的Context,什么时候用Activity的Context

转至:http://www.android100.org/html/201510/05/187714.html 如果我们在Activity A中或者其他地方使用Foo.getInstance()...
  • h183288132
  • h183288132
  • 2016-04-07 16:13:36
  • 1108

android中this、Activity.this、context区别与联系

参考博文:http://www.cnblogs.com/wenjiang/archive/2012/10/15/2724923.html private Context mContext; mCo...
  • u012478345
  • u012478345
  • 2015-01-18 10:41:44
  • 4141

Activity与Context的继承关系

一直对Activity与Context的关系不是太清楚,抽空瞅了一眼,顺带看了一下android中其他重要组件的继承关系。倒也不复杂。耳边又响起了那首儿歌,“爸爸的爸爸叫爷爷~爸爸的兄弟叫叔叔~”。简...
  • daihuimaozideren
  • daihuimaozideren
  • 2017-10-02 14:50:28
  • 773

application的context和activity的context区别

问题:在一个activity中有时可以随意的使用这两个context,但是android为什么这么设计,在程序中什么时候要用到Application的Context呢?Application的Cont...
  • geshuai123
  • geshuai123
  • 2015-04-21 11:13:19
  • 670

android Activity中如何获取Context对象

在Activity中获取Context getApplicationContext() 使用场景: getAccount(String title, Context ...
  • u010477502
  • u010477502
  • 2015-08-13 16:01:53
  • 5079

Android中的Context、Activity和Application的区别

Activity和Application都是Context的子类,Context是上下文的意思,在实际应用中它起到了管理上下文环境中各个参数和变量的作用。虽然Application和Activity都...
  • xuqiaobo
  • xuqiaobo
  • 2016-09-26 20:24:40
  • 1433

android中Contex的使用例子(在一个普通类中用context去开开启一个activity)

前提:A继承Activity,B一个普通的类,且构造函数是这样的 private Context ctx; public Purchase(Context c) { // TODO Auto-g...
  • u011761947
  • u011761947
  • 2014-09-01 17:12:39
  • 1502

Android:根据上下文Context获取Activity

根据Context获取Activity: private Activity getActivity() { Context context = getContext(); while ...
  • shuaiguo521
  • shuaiguo521
  • 2015-10-15 15:50:10
  • 5670

Android深入理解Context(二)Activity和Service的Context创建过程

上一篇文章我们学习了Context关联类和Application Context的创建过程,这一篇我们接着来学习Activity和Service的Context创建过程。需要注意的是,本篇的知识点会和...
  • itachi85
  • itachi85
  • 2017-06-12 00:08:56
  • 2112
收藏助手
不良信息举报
您举报文章:Android中Aplication中Context和Activity中的Context的异同
举报原因:
原因补充:

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