安卓context(一)

最近看了一下深入安卓内核,毫无安卓基础的我一头深入不可自拔,看的是云里雾里,第一遍看到一半左右似乎开始失去了效率。

现在开始第二遍,并对看过的重要知识点以个人的理解进行梳理(不免有错的地方,好心人请告知,我也会经常反复阅读与更新)

 

其实我个人理解的话,context是一个页面或者说是一个场景。

我想刚开始我们可以从UML图挖掘我们一些基础知识。

1 可以看出我们常用的activity和service都是继承或者间接继承的是ContextWrap类。

2 有所不同的是activity是通过contextThemeWrapper来的,其实也很好理解,因为activity是有页面的所以他需要一个主题。

Context类本身是一个纯abstract类,那ContextWrap是什么呢?从他的构造函数可以看出他是context的一个包装

public class ContextWrapper extends Context {
    Context mBase;

    public ContextWrapper(Context base) {
        mBase = base;
    }

 

OK,一下子右边半边的类图我们已经清楚了。

接下来我们看左边的ContextImpl他往下没有子类,而从这个名字来看他应该是真正实现了context的所有抽象方法。

 

那么我们找一下再哪里有被调用?

我们发现代码在ActivityThread中的handleBindApplication()方法中,此方法内部调用了makeApplication方法里面恰好有new contextImpl()

public Application makeApplication(boolean forceDefaultAppClass,  
        Instrumentation instrumentation) {  
        String appClass = mApplicationInfo.className;  
        java.lang.ClassLoader cl = getClassLoader();  
        ContextImpl appContext = new ContextImpl();  //创建contextImpl对象
        appContext.init(this, null, mActivityThread);  //进行初始化赋值,请注意第一个参数this是值得mPackageInfo对象
        application app = mActivityThread.mInstrumentation.newApplication(  
                cl, appClass, appContext);  
        appContext.setOuterContext(app);  
    }
    ...  
}  

 

可见在创建context的时候会用到contextImpl类。

 

那么我们接下来看一下application、service、activity的创建过程我这边分别用/隔开,其实原理都是一样的。

 

1 AMS创建ApplicationInfo/Servicelnfo/Activitylnfo对象

 

2 AMS通过IPC调用的activeThread对象的bindApplication/scheduleCreateService/scheduleLaunchActivity方法将ApplicationInfo/Servicelnfo/Activitylnfo传入。

 

3 bindApplication/scheduleCreateService/scheduleLaunchActivity方法会将ApplicationInfo/Servicelnfo/Activitylnfo的值赋值给AppBindData/CreateServiceData/ActivityRecord

 

4 调用handleBindApplication/handleCreateService/handleLaunchActivity方法中的getPackageInfoNoChecked()方法为AppBindData/CreateServiceData/ActivityRecord的Info属性赋值PackageInfo

 

5 调用make方法创建对应的context

以上5个步骤分别是创建activity,application,service对象,注意packageInfo是一个全局的对象。context和package是多对一的关系

 

1 说简单点其实就是AMS需要把INFO信息传递给ActivityThread

2 activityThread将传入的Info信息包装一下成为自己的数据结构DATA

3 然后再去获取全局的PackageInfo对象装载到自己的DATA里

4 调用makeXXX进行创建

 

context的个数=service+activity+application(1个)

 

转载于:https://www.cnblogs.com/sunfan1988/p/4377421.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值