浅析 Android中Activity窗口创建流程

问题:为什么作为四大组件中的Activity能有界面显示,而其他组件都没有界面显示,到底是谁在控制着界面显示呢?下面我们就来研究一下吧!   我们发现Activity内部依赖一个叫Window的东西(“窗口”,字面意思有点像是用于展示界面的东西),的确它就是Activity能够界面显示的关键,我们通过它为纽带来进一步阐述。public class Activity extends Con...
摘要由CSDN通过智能技术生成

问题:为什么作为四大组件中的Activity能有界面显示,而其他组件都没有界面显示,到底是谁在控制着界面显示呢?下面我们就来研究一下吧!

   我们发现Activity内部依赖一个叫Window的东西(“窗口”,字面意思有点像是用于展示界面的东西),的确它就是Activity能够界面显示的关键,我们通过它为纽带来进一步阐述。

public class Activity extends ContextThemeWrapper
..
 private Window mWindow;

 

1,概念了解:

        Window:抽象窗口(这个与WMS创建的窗口概念并不一样), Activity只是通过Window与视图捆绑,通过这个封装媒介

扭转,最终才能与WMS联系创建系统窗口。

        PhoneWindow:(实际Window实现对象,内有DecorView:我们的根视图)

        WindowManagerService(简称WMS): 窗口管理系统服务,用于统筹管理窗口创建,展示及排序。

               WindowToken:窗口令牌(窗口创建的合法性标识, 由WMS分配,是创建窗口的唯一凭据) 

               IWindowSession(Session为其Bn端实现类):    WMS也不是应用直接能够去跟它打交道创建窗口,应用需要让它建立一次链接Session,然后应用通过Session去间接跟它打交道。     

             (至于WindowState等此次暂不研究)

       WindowManagerImpl:(windowManager的实现类:主要包含Display和 Window)  

       WindowManagerGlobal:()

       ViewRootImpl:(视图绘制分发源头,也是最终于WMS交互创建可视化界面的地方)

              W:(IWindow的Bn端实现类,用于WMS与ViewRootImpl交互)

 

2,流程分析:

     WMS作为窗口的大管家,不是任何请求过来都去创建窗口,当然只会为它能够认同的去创建。如何得到它认同(就需要注册WindowToken令牌),只有持有WindowToken令牌的请求过来才会去为其创建。

     那么在Activity启动过程中,应该是某个环节要去申请令牌了(由于WMS是系统服务,那么最好是AMS启动Activity的过程最合适实际去打交道了,申请令牌的动作应该是私密的,不应该让应用自己去做,否则容易被串改)

    由于令牌在WMS中存储,肯定不会直接暴露给应用去直接用,因此需要通过索引查找到令牌,而该索引肯定是应用能够具备的(那就意味着我们创建令牌的时候,需要将相关索引值传递给WMS,同时Activity中也需要持有当前索引,这样才能找到)

    最后,校验令牌通过后,就可以创建窗口啦。

 

3,具体剖析:

    (1) Activity启动过程去申请令牌

            Android启动过程大致为: 前一个Activity先pause后,新的Activity去启动(若新进程则需要创建进程)。

     AMS创建Activity的实际是交给ActivityStack处理:

 

ActivityRecord: appToken创建源头

    ActivityRecord(ActivityManagerService _service, ActivityStack _stack, ProcessRecord _caller,
            int _launchedFromUid, Intent _intent, String _resolvedType,
            ActivityInfo aInfo, Configuration _configuration,
         
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值