Android技术紫水晶书院•文思飞扬(散文、随笔、杂文、评论、科普、日记……

Android - Context

2019-07-07  本文已影响126人  穿越平行宇宙

一个应用有多少个Context,Context里主要包括什么具体的东西?

1. 概念

上下文环境、语境

官方文档综述

Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.

以上可以翻译成三点:
1)它描述的是一个应用程序环境的信息,即所谓的上下文了
2)该类是一个抽象类(abstract class),Android提供了该类的具体实现类(ContextIml)
3)通过它我们可以获取应用程序的资源和类,也包括一些应用级别的操作,例如启动一个Activity,发送广播,接受intent等。

Context,相信不管是第一天开发Android,还是开发Android的各种老鸟,对于Context的使用一定不陌生~~你在加载资源、启动一个新的Activity、获取系统服务、获取内部文件(夹)路径、创建View操作时等都需要Context的参与,可见Context的常见性。大家可能会问到底什么是Context,Context字面意思上下文,或者叫做场景,也就是用户与操作系统操作的一个过程,比如你打电话,场景包括电话程序对应的界面,以及隐藏在背后的数据;

但是在程序的角度Context又是什么呢?在程序的角度,我们可以有比较权威的答案,Context是个抽象类,我们可以直接通过看其类结构来说明答案:

image.png

可以看到Activity、Service、Application都是Context的子类;

也就是说,Android系统的角度来理解:Context是一个场景,代表与操作系统的交互的一种过程。从程序的角度上来理解:Context是个抽象类,而Activity、Service、Application等都是该类的一个实现。

在仔细看一下上图:Activity、Service、Application都是继承自ContextWrapper,而ContextWrapper内部会包含一个base context,由这个base context去实现了绝大多数的方法。

2、我们来看一下context的相关类的继承关系

image.png

通过图上我们可以看出:Activity类 、Service类 、Application类本质上都是Context子类,知道为什么老是在这些里面用到context了吧?

3、Application、Activity和Service作为Context的区别

相同点:它们都间接继承了Context。

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

看一下类结构关系Context有三个子类 Application Activity Service 因此回到最开始的问题
一个应用中的Context实例一般有Application(只有1个)+ Activity(假设10个)+ Service(假设5个)=16

什么时候创建Context实例?
1)创建Application对象时(整个App只有一个Application对象)
2)创建Activity时
3)创建service时

上一篇下一篇

猜你喜欢

热点阅读