安卓建立应用窗口(三)

概要理解数组

1 每一个应用窗口都对应了一个activity对象,所以建立窗口以前得先建立activity对象spa

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

3 启动activity的任务由activityThread完成对象

 

应用窗口的建立过程token

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

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

 

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

APPcontext :该对象将做为Activity的BaseContextit

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

         这里的层次结构有点像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添加窗口的惟一入口)

相关文章
相关标签/搜索