一、context是什么?
学的时候是定义为当前上下文环境,一个Context意味着一个场景、环境,一个场景就是我们和软件进行交互的一个过程。
Activity类的确是基于Context,而Service类也是基于Context。
二、context的继承关系
Context 本身是一个抽象类,主要实现类为 ContextImpl,另外有子类 ContextWrapper 和 ContextThemeWrapper,这两个子类都是 Context 的代理类,主要区别是 ContextThemeWrapper 有自己的主题资源。
image.png
ContextThemeWrapper内部包含了与主题相关的接口,这里的主题就是指在AndroidManifest.xml中通过android:theme为Application或者Activity指定的主题。
只有Activity才需要主题,Service默默的后台工作者不需要穿的那么鲜艳,所以Service直接继承于ContextWrapper。
三、context 有什么用?
Context 相当于 Application 的大管家,主要负责:
四大组件的交互,包括启动 Activity、Broadcast、Service,获取 ContentResolver 等
获取系统/应用资源,包括 AssetManager、PackageManager、Resources、System Service 以及 color、string、drawable 等
文件,包括获取缓存文件夹、删除文件、SharedPreference 相关等
数据库(SQLite)相关,包括打开数据库、删除数据库、获取数据库路径等
其它辅助功能,比如设置 ComponentCallbacks,即监听配置信息改变、内存不足等事件的发生
注 Application context的确可以开始一个Activity,但是它需要创建一个新的task。这可能会满足一些特定的需求,但是在你的应用中会创建一个不标准的回退栈(back stack),这通常是不推荐的或者不是是好的实践。
四、如何创建?
-
创建Application 对象时, 而且整个App共一个Application对象
-
创建Service对象时
-
创建Activity对象时
因此应用程序App共有的Context数目公式为:
总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)
五、如何获取?
1:View.getContext,返回当前View对象的Context对象,通常是当前正在展示的Activity对象。
2:Activity.getApplicationContext,获取当前Activity所在的(应用)进程的Context对象,通常我们使用Context对象时,要优先考虑这个全局的进程Context。
3:ContextWrapper.getBaseContext():用来获取一个ContextWrapper进行装饰之前的Context,可以使用这个方法,这个方法在实际开发中使用并不多,也不建议使用。
4:Activity.this 返回当前的Activity实例,如果是UI控件需要使用Activity作为Context对象,但是默认的Toast实际上使用ApplicationContext也可以。
六、不同的context有何差别?
- ContextWrapper、ContextThemeWrapper、ContextImpl 的区别:
ContextWrapper、ContextThemeWrapper 都是 Context 的代理类,二者的区别在于 ContextThemeWrapper 有自己的 Theme 以及 Resource,并且 Resource 可以传入自己的配置初始化
ContextImpl 是 Context 的主要实现类,Activity、Service 和 Application 的 Base Context 都是由它创建的,即 ContextWrapper 代理的就是 ContextImpl 对象本身
ContextImpl 和 ContextThemeWrapper 的主要区别是, ContextThemeWrapper 有 Configuration 对象,Resource 可以根据这个对象来初始化
Activity Context、Service Context、Application Context、Base Context 的区别:
2.Activity、Service 和 Application 的 Base Context 都是由 ContextImpl 创建的,且创建的都是 ContextImpl 对象,即它们都是 ContextImpl 的代理类
Service 和 Application 使用同一个 Recource,和 Activity 使用的 Resource 不同
getApplicationContext 返回的就是 Application 对象本身,一般情况下它对应的是应用本身的 Application 对象。
七、getApplication()、getApplicationContext的区别
1.getApplication()
了解getApplication()方法,首先要了解Application类,Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类。
Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息。那我们可以把它当做是一个全局变量来使用,可以保存一些共享的数据,或者说做一些工具类的初始化工作。要自己来使用Application的话我们需要先新建一个类来继承Application
public class MyApplication extends Application {}
2.getApplicationContext()
getApplicationContext() 是返回应用的上下文,也就是把Application作为Context,生命周期是整个应用,应用摧毁它才摧毁。这里要区别一下Activity的Context,Activity.this的context 返回当前Activity的上下文,及把Activity用作Context,生命周期属于Activity ,Activity 摧毁他就摧毁。
网友评论