Android中的Context类解析

时间:2020-12-22 04:04:37


一、Context类官方说明:

  1. 是应用程序全局信息数据有关的方法类
  2. 是一个抽象类,由android 系统提供该类的具体实现类ContextImppl类
  3. 通过context可以获取应用程序的resources和classes等

二、Context类的主要用途:

  1. 加载资源(file,res中的文件等)获取包名等(context.getResource())
  2. 启动activity或发送广播等(context.startActivity(intent))
  3. 构造视图(new View(context))
  4. 获取系统服务(context.getSystemService())

三、context类的继承结构:
Android中的Context类解析
tips:
1.ContextImpl为系统提供的Context的实现类
2.ContextWrapper为context的封装类,里面有一个mBase属性变量是ContextImpl类的实例,通过attachBaseContext(Context base)来将ContextImpl实例传入,attachBaseContext(Contextbase)方法是由系统调用的,通过contextWrapper.getBaseContext()可以获得,ContextWrapper中所有的Context方法都是通过调用mBase的同名方法来实现的
3.Application,Service,Activity都是Context的子类,因此一个应用中context的数量 =Activity的数量+Service的数量+1;
四、Application、Service、Activity的具体分析
activity,Service,Application都是Context的子类,他们的context功能都是有ContextImpl去实现的,因此绝大多数情况下这三种类型的context都是可以通用的,特殊情况下出于安全考虑,startActivity时必须是在一个Activity类的context上开启另一个Activity形成返回栈,弹出Dialog也必须在Activity类型的Context
Application、Service、Activity实例化ContextWrapper中的mBase(ContextImpl实例)是在构造方法之后,onCreate方法之前被系统调用的,所以有关context方法的调用必须要在attachBaseContext之后才能调用
Android中的Context类解析

1、Application:单例模式的application全局状态类,每一个应用程序都有一个Application类,当应用的进程被创建时, Application会在所有class实例化之前最先实例化,可以通过继承来自定义MyApplication, 封装一些通用的操作:

//Application已经是单例模式了,子类无需在封装单例保护
public class MyApplication extends Application {
private static MyApplication app;

public static MyApplication getInstance(){
return app;
}
@Override
public void onCreate() {
super.onCreate();
app = this;
}

//定义自己的通用方法

}

//在manifest中 使用自定义的MyApplication类
<application
android:name=".MyApplication"//自定义的MyApplication类的全称
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">