一、Context类官方说明:
- 是应用程序全局信息数据有关的方法类
- 是一个抽象类,由android 系统提供该类的具体实现类ContextImppl类
- 通过context可以获取应用程序的resources和classes等
二、Context类的主要用途:
- 加载资源(file,res中的文件等)获取包名等(context.getResource())
- 启动activity或发送广播等(context.startActivity(intent))
- 构造视图(new View(context))
- 获取系统服务(context.getSystemService())
三、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之后才能调用
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">