• 安卓创建应用窗口(三)


    概要理解

    1 每个应用窗口都对应了一个activity对象,因此创建窗口之前得先创建activity对象

    2 当AMS决定启动某个Activity时,会通知客户端进程的activityThread。

    3 启动activity的任务由activityThread完成

     

    应用窗口的创建过程

    ------------------初始化activity类和内部的window类

    1 使用ClassLoader从程序文件中装载指定的Activity对应的Class文件

    2 接着调用Activity的attach()方法初始化赋值

    APPcontext :该对象将作为Activity的BaseContext

    token :一个ActivityRecord对象,也是AMS里面的historyRecord
    parent :父类引用
    window :窗体描述,用于接受AMS的信息(内部存有当前activity引用用于callback),
             window里面都含有一个windowManager接口,由WindowManagerlmpl实现。
             windowManager--->window.LoaclWindowManager(包装类)-->WindowManagerImpl(唯一)

             这里的层次结构有点像context类的里面包装PackageInfo对象一样,保证了每个activity的windowManager其实是一个轻量级的引用,不会造成资源的冗余。

    -------------------创建view类

    3 执行performLaunchActivity()-->callActivityOnCreate()-->onCreate()方法添加view类

    4 调用用户编写的setContentView()--->PhoneWindow的setContentView()

              a 用installDecor()方法为Window类安装一个窗口修饰(标题栏)
              b 读取layout.XML为view对象初始化窗口内容

    -------------------发送到AMS处理(AMS封装数据并传递给WMS进行处理)

    1 activitythread传递activity给AMS,AMS调用windowMangerImpl类用于管理窗口(windowMangerImpl只有唯一一个,无论有多少个activity)
    windowMangerImpl的内部维护了三个数组
               View[] mViewS 窗口列表
               ViewRoot[] mRootS mViews对应的ViewRoot对象。
               WindowManager.LayoutParams[] mParams mViewS对应的LayoutParams窗口参数对象
    当把 mViews 中的 View 对象当做一个窗口 添加进WmS中,WmS要求每个被添加的窗口都要对应一个LayoutParams对象,mParams正是保存了每一个窗口对应的参数对象。


    2 新建一个viewRoot对象并初始化setView (View view、WindowManager.LayoutParams attrs、View panelParentView)
    这里的初始化过程是,先新建原本3个数组长度+1的数组,然后把原来数组mViews、mRoots、mParam复制到新数组并在尾部添加新的元素


    3 调用sWindowSession.add(),通知WmS添加窗口(这是客户程序请求W m S添加窗口的唯一入口)

     

     

  • 相关阅读:
    【LintCode题集】Q539
    【LintCode题解】Q407
    【LintCode题集】Q6、Q64
    【Java安全】关于Java中常用加密/解密方法的实现
    【MySQL】MySQL5.7的安装与配置
    理解CSS3 max/min-content及fit-content等width值
    Django和MySQL数据库第一次连接时遇到的若干问题及解决办法
    使用Pycharm社区版启动Django的重要补充
    使用Pycharm社区版新建Python3.7的虚拟环境并安装启动Django的完整步骤
    04-图形化编辑器功能不全?
  • 原文地址:https://www.cnblogs.com/sunfan1988/p/4377430.html
Copyright © 2020-2023  润新知