Android UI框架概览

Android App真实的逻辑构成

Android UI框架概览_第1张图片

App UI构成层级结构

在Android中绝大部分的UI组件都是存放在android.widget包及其子包、android.view包及其子包,其中所有的UI视图组件都是继承自View,View类还有一个重要的子类ViewGroup,所以它也具有View的特性,但它主要用来充当View的容器,将其中的View视作自己的孩子,对它的子View进行管理,当然它的孩子也可以是ViewGroup类型。ViewGroup往往是作为其他的组件的容器。

在Android中,View比视图具有更广的含义,它包含了用户交互和显示,更像Windows操作系统中的window。ViewGroup(根节点)和它的孩子们(View和ViewGroup)以树形结构形成了一个层次结构,View类有接受和处理消息的功能,android系统所产生的消息会在这些ViewGroup和 View之间传递。所有App的界面构成都是如下图的逻辑:

Android UI框架概览_第2张图片

更为详细的构成结构可以参考:



其中View的子类TextView是最值得关注的:


App UI界面显示到屏幕的逻辑原理:

当ActivityThread接收到AMS发送start某个Activity后,就会创建指定的Activity对象。Activity又会创建PhoneWindow类-DecorView类-创建相应的View或者ViewGroup。创建完成后,Activity需要把创建好的界面显示到屏幕上,于是调用WindowManager类,后者于是创建一个ViewRoot对象,改对象实际上创建了ViewRoot类和W类,创建ViewRoot对象后,WindowManager再调用WMS提供的运程接口完成添加一个窗口并显示到屏幕上。

主要逻辑流程:

Activity setContentView—>Window setContentView—>PhoneWindow setContentView—->PhoneWindow installDecor—–>PhoneWindow generateLayout——>PhoneWindow mLayoutInflater.inflate(layoutResID, mContentParent);

Activity 类中有一个Window抽象类的实现PhoneWindow类,该类中有个内部类DecorView,继承自FrameLayout,在DecorView容器中添加了根布局,根布局中包含了一个id为 contnet的FrameLayout 内容布局,我们的Activity加载的布局xml最后添加到 id为content的FrameLayout布局当中了。用一个图来描述,如下:

Android UI框架概览_第3张图片

处理逻辑类简介:

ActivityThread:该类为应用程序的主线程类,所有的apk程序都有且仅有一个ActivityThread类,程序的入口为该类中的static main函数,ActivityThread所在的线程即为UI线程或者主线程。

Activity:该类为apk程序的apk程序的最小的运行单元,换句话说就是主线程动态加载可执行代码的最小单元类,一个apk程序中可以包含多个Activity对象,ActivityThread主类会根据用户操作选择动态加载哪个Activity对象。

PhoneWindow:该类继承自Window类,同时,PhoneWindow类内部包含了一个DecorView对象,DecorView的父类是FrameLayout,因此,PhoneWindow是内含一个View对象,并提供了一组通用窗口操作API.

Window:该类提供了一组通用的窗口操作api,这里的窗口仅仅是客户端程序层面上的,wms所管理的窗口并不是window类,而是一个View或者ViewGroup类,对于PhoneWindow类而言就是其内部包含的DecorView类。Window是一个abstract类型。

DecorView:该类是一个FrameLayout的子类,并且是PhoneWindow中的一个内部类。DecorView是对普通的FrameLayout进行了一定的装饰,比如添加一个通用的TileBar,并响应特定的按键消息等。

ViewRoot:wms管理客户端窗口时,需要通知客户端进行某种操作,这些都是通过IPC调用完成的,而在客户端窗口收到IPC调用后,都会把该调用转换为本地的一个异步调用,实现的方式是使用Handler,ViewRoot就是继承于Handler,其作用主要是把wms的IPC调用转换为本地的一个异步调用。ViewRoot这个类在android的UI结构中扮演的是一个中间者的角色,连接的是PhoneWindow跟WindowManagerService.WindowManagerService中我们知道它读取android系统里所有事件,键盘事件,轨迹球事件等等,它怎么分发到各个activity的呢?就是通过这个ViewRoot。

WindowManager类:客户端要申请创建一个窗口,而具体创建窗口的任务是由wms完成的,windowmanager类就像是一个部门经理,谁有什么需求就告诉它,由它和wms进行交互,客户端不能直接和wms进行交互。


主要参考:

https://blog.csdn.net/a910626/article/details/51553589

https://www.cnblogs.com/aademeng/articles/6539190.html


你可能感兴趣的:(Java/Android)