Activity中Window对象的创建过程

看过Activity源码的同胞应该知道,Activity就是对Window对象进行了一个包装,里面的很多操作实质是由Window来完成的,但是Window类是一个抽象类,那么Activity里面的Window属性mWindow所引用的肯定不是Window对象本身,而是它的一个子类,那么到底是那个类,这个对我们后面代码的跟踪非常关键,因为如果找不到这个类,就找不到Activity的很多操作的实现是如何实现的。所以,下面就看看这个Window对象的创建过程。
我们直接看代码,在代码中说明,首先看Activity类。

public class Activity extends ContextThemeWrapper
        implements LayoutInflater.Factory2,
        Window.Callback, KeyEvent.Callback,
        OnCreateContextMenuListener, ComponentCallbacks2 {

    ......
    //很清楚,Activity里面有一个Window对象,Activity的很多操作就是调用的它的方法
    private Window mWindow;

    //这个方法在Activity启动的过程中会被执行
    //在这个方法中,我们看到了Window对象的创建
    final void attach(Context context, ActivityThread aThread,
            Instrumentation instr, IBinder token, int ident,
            Application application, Intent intent, ActivityInfo info,
            CharSequence title, Activity parent, String id,
            NonConfigurationInstances lastNonConfigurationInstances,
            Configuration config) {

        ......
        //创建Window对象
        mWindow = PolicyManager.makeNewWindow(this);
        ......
    }

}

在Activity里面有一个attach方法,在这个方法中创建了Window对象,下面看PolicyManager里面的makeNewWindow方法。

public final class PolicyManager {
    ......
    private static final IPolicy sPolicy;

    public static Window makeNewWindow(Context context) {
        return sPolicy.makeNewWindow(context);
    }
}

在这个代码里面调用的是IPolicy里面的makeNewWindow方法,一看IPolicy就知道它是一个接口,真正的实现是在它的实现类Policy中完成的,直接看代码。

public class Policy implements IPolicy {
    ......
    public Window makeNewWindow(Context context) {
        //看到没有,是一个PhoneWindow对象
        return new PhoneWindow(context);
    }
    ......
}

这就看到了创建的是一个PhoneWindow对象,也就是说Activity里面的Window属性引用的就是PhoneWindow对象,调用Window的方法实质调用的就是PhoneWindow的方法,都在这里实现了。

总结:
1、在启动Activity的过程中会调用一个attach函数
2、在attach函数中会执行PolicyManager.makeNewWindow(this)
3、进一步深入,真正执行makeNewWindow的其实是IPolicy,它只是被PolicyManager进行了包装。
4、IPolicy是一个接口,所以makeNewWindow的执行是由它的实现类Policy来执行的。
5、可以看到执行创建了一个PhoneWindow对象并且返回,最终也是将这个对象赋值给mWindow。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值