Android Context知识梳理

今天看了一篇郭神的文章—Android Context完全解析,填补一下自己这方面的空白,郭神文章传送门。

Context类型

先来看一下Context的继承结构:
Android Context知识梳理_第1张图片
继承结构

概括地说,Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别承担着不同的作用,但它们都属于Context的一种,而他们具体的功能则是由ContextImpl类去实现的。

Context数量

Context一共有Application、Activity和Service三种类型,因此一个应用程序中Context数量的计算公式可以这样写:

Context数量 = Activity数量 + Service数量 + 1

(1 代表Application数量,因为一个应用程序可以有多个Activity和多个Service,但只能有一个Application)

Application Context的设计

1、MyApplication myApp = (MyApplication) getApplication();
2、Context appContext = getApplicationContext();

这两种方法取到的是同一个对象, getApplication() 方法的语义性非常强,一看就知道是用来获取 Application 实例的,但是这个方法只有在 Activity 和 Service 中才能调用的到。如果在 BroadcastReceiver 中也想获得 Application 实例,就可以借助 getApplicationContext() 方法了。

使用 Application 的问题

Application 方法执行顺序:
Android Context知识梳理_第2张图片
执行顺序

Application 中在 onCreate() 方法里去初始化各种全局的变量数据是一种比较推荐的做法。但是如果想把初始化的时间点提前到极致,也可以重写 attachBaseContext() 方法。

public class MyApplication extends Application {
        @Override
        protected void attachBaseContext(Context base) {
                //在这里调用Context的方法会崩溃
                super.attachBaseContext(base);
                //在这里可以正常调用Context方法
        }
}

自定义 Application 不需要和单例模式混合使用,Application 全局只有一个,它本身就已经是单例了,无需再用单例模式去为它做多重实例保护了。

public class MyApplication extends Application {

        private static MyApplication app;

        public static MyApplication getInstance() {
                return app;
        }

        @Override
        public void onCreate() {
                super.onCreate();
                app = this;
        }
}

getInstance() 方法可以照常提供,但里面不要做任何逻辑判断,直接返回app对象就可以,在 onCreate() 方法中将 app 对象赋值成 this,this 就是当前 Application 的实例,那么 app 也就是当前 Application 的实例了。

你可能感兴趣的:(Android Context知识梳理)