美文网首页
Android Context 区别

Android Context 区别

作者: silencefun | 来源:发表于2018-03-29 11:20 被阅读0次

    一、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),这通常是不推荐的或者不是是好的实践。

    四、如何创建?

    1. 创建Application 对象时, 而且整个App共一个Application对象

    2. 创建Service对象时

    3. 创建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有何差别?

    1. 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 摧毁他就摧毁。

    相关文章

      网友评论

          本文标题:Android Context 区别

          本文链接:https://www.haomeiwen.com/subject/yczjvxtx.html