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

看下我用红线标出来的地方,从这里可以看到Activity、Service、Application都是Context的子类;

2、再来从源码角度看Context类:

public abstract class Context {......
}

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

二、下面我们来看一下在Android系统中Context类的继承结构:

通过继承关系可以看到,Context直接子类为ContextIml(具体实现类)和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。

Android Application中的Context和Activity中的Context的异同相关推荐

  1. android 服务的应用,在Activity中实现背景音乐播放

    在Android应用程序里,有一种没有UI的类(android.app.Service)--Service.简单来说,Service是一个 background process(背景程序),通过背景程 ...

  2. 在Android studio的一个新建的Activity中添加Toolbar以及相应的功能添加

    Toobar一般用在实现一个APP的很多页面的标题的时候会用到,实现的方法也有很多种. 注意:Toolbar需要在工程中引入appcompat-v7的兼容包,需要使用android.support.v ...

  3. 【Android】12.3 在当前Activity中获取另一个Activity的返回值

    分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 在上一节的示例中,通过StartActivity(Intent)方法启动另一个Activity后,这两个Activ ...

  4. android activity pause,关于android:onPause()和onStop()在Activity中

    我是Android开发的新手,但我仍然无法理解活动中的onPause()和onStop()方法. 在我的应用程序中,我有一个名为Counter的静态类,该类将变量的状态保存在应用程序的内存中.我的应用 ...

  5. android 多个fragment切换,一个Activity中多个Fragment的切换

    经常会遇到在一个activity界面上布局多个fragment,但是如何从一个fragment跳转到另一个fragment呢?今天在做项目中恰好遇到这样的问题,点击首页fragment的更多店铺,会切 ...

  6. Android之Toolbar的三个问题:修改左边箭头颜色、怎样修改右边以及子activity中的toolbar添加返回箭头

    1)怎样修改左边这个小箭头的颜色? 2)怎样修改右边这三个点的颜色.怎样把这三个点替换成我自己的图标? 3)怎样让"交易清单"这4个字居中显示? 首先设置Theme为AppComp ...

  7. Android之Toolbar的三个问题:修改左边箭头颜色、怎样修改右边以及子activity中的toolbar添加返回箭头...

    1)怎样修改左边这个小箭头的颜色? 2)怎样修改右边这三个点的颜色.怎样把这三个点替换成我自己的图标? 3)怎样让"交易清单"这4个字居中显示? 首先设置Theme为AppComp ...

  8. activity中fragment 返回键不退出_分享一波阿里Android客户端面经,我竟连这都答不上来?...

    今天整理了电脑,发现了几个月前总结了一半的阿里面经,想起来了去年秋招不愉快的阿里一面,今天分享给大家.希望大家前事不忘后事之师,吸取经验教训. 一面(挂) 1.点击图标,应用打开,点击home键,重新 ...

  9. Android学习笔记(十一)——将Fragment添加到Activity中以及参数传递

    将Fragment添加到Activity中 Fragment的布局文件 <LinearLayout xmlns:android="http://schemas.android.com/ ...

最新文章

  1. R语言gganimate包创建可视化gif动图:ggplot2可视化静态条形图(bar plot)、gganimate包创建动态条形图(bar plot)动画、基于transition_time函数
  2. Openstack数据库初始化时为何要重复授权
  3. java 实现 DES加密 解密算法
  4. python rabitmq_python RabbitMQ队列使用
  5. php.ini文件中的include_path设置
  6. 2LIS_13_VDITM中开票项目数量计算错误
  7. 随想录(git操作)
  8. ~~Bellman-Ford算法
  9. javaweb四种域对象的应用
  10. 用Bluemix虚拟机搭建自己的博客系统
  11. 第五章:项目范围管理 - (5.4 创建 WBS )
  12. 思科交换机和路由器的配置
  13. LC152---乘积最大子数组
  14. android 手机内存分配,【扫盲贴』关于android手机中RAM(也就是 运行内存)的分配...
  15. 台式计算机刚换的显示屏怎么设置,如何设置双屏显示(笔记本电脑双屏切换的快捷键)...
  16. 如何从电脑内转播声音
  17. 记录一次公司点星PBX(DotAsterisk) 映射外网后外部SIP分机注册拨通无声音的故障解决方法
  18. AI智能联系人管理系统(一)
  19. 支持向量机蠓虫分类问题
  20. 阿里云 blink 相关错误码问题解决

热门文章

  1. 【Android View绘制体系】invalidate
  2. python modbus tk 库_如何使用modbus tk rtu(python)设置简单的从机和主机
  3. Hbuilder Android证书申请
  4. php实现人员权限管理(管理员界面)
  5. 四种排序(冒泡、插入、递归、选择)
  6. IDEA中MAVEN项目打JAR包的简单方法
  7. MySQL:基础—数据分组
  8. [转] Linux GCC 编译使用
  9. 【iOS】Xcode 使用 CocoaPods 导入第三方库后没有提示
  10. elf文件下载出错问题