【Android 源码解析】应用窗口Window的实现机制


一、前言:

【1】Android系统中窗口分为三类:

应用窗口:每个Activity对应的窗口;

子窗口:必须依附在应用窗口上的窗口;

系统窗口:由系统创建,不依赖任何应用窗口。

二、应用窗口的创建过程:

【1】初始化Window、WindowManager:

先回顾一下Activity的启动过程——由ActivityManagerService通过Bindler进程间通信机制向客户端进程ActivityThread发送创建新的Activity对象的通知,所有Activity的创建都在对应应用程序进程ActivityThread中完成。

在Activity创建完成后,会调用Activity的attach方法


分析:

1、在attach方法中首先创建一个PhoneWindow,PhoneWindow是实现了抽象类Window的子类;

2、为PhoneWindow设置事件回调监听。由于设置了事件回调监听,Activity可以分发处理触摸事件

3、为PhoneWindow设置窗口消失回调监听。由于设置了窗口消失回调监听,在Window消失后,可finish掉Activity

4、将当前Activity的WindowManager对象设置给PhoneWindow;

5、Activity的WindowManager和PhoneWindow的WindowManager是同一个。

【2】添加View到应用窗口:

我们已经知道了Window是如何在Activity中创建,那么View是如何添加到Window上?

首先,先来看下setContentView的源码:


getWindow()得到的就是Activity的成员变量mWindow,也就是PhoneWIndow。而PhoneWindow的setContentView的实现过程就是将layout给inflate到window上。

【3】Activity添加窗口Window的过程:

前面已经讲完了“Window是如何添加view的”,“Window和Activity一一对应”,现在讲下“Activity是如何添加Window的”。

Activity是通过ActivityThread的handleResumeActivity来启动Activity:


可以看到是通过WindowManager的addView方法来对Window的View进行添加。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值