Android中的Context类解析


一、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类的继承结构:
这里写图片描述
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">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值