《深入理解Android》学习-View体系(一)
SurfaceFlinger和WMS支撑起了Android的GUI的底层,但是和终端用户直接交互的还是View系统,本节将对View系统进行介绍,主要描述view的管理以及绘制过程。
1.1 View框架
下图是View框架的核心类图。
先介绍下上面图中各个类的关系。
- Activity和Window
Activity支持UI显示,但是并不是直接进行View树的管理,Activity中定义了一个Window类型的对象mWindow。而Window是个基类,系统根据不同的产品来产生不同的子类。具体是在调用Activity.attach中调用PolicyManager.makeNewWindow来决定的,目前默认生成的都是PhoneWindow。 - Window和WindowManagerImpl
Window具有两层含义,一方面它面向Activity,承担着显示UI的作用;另一方面它还要同WindowManagerService通信。当然,这个也不是直接在Window中实现的,不然会造成功能混乱,这个功能由WindowManager来实现,而Window中包含了一个WindowManager的对象mWindowManager,WindowManager是一个接口,其真正的实现是在WindowManagerImpl当中。 - ViewRoot和WindowManagerImpl的关系
android4.3 版本之前,WindowManagerImpl在每个进程中只有一个实例,在WindowManagerImpl内部,保存着这样的3个变量:
private View[] mViews;
private ViewRootImpl[] mRoots;
private WindowManager.LayoutParams[] mParams;
android4.3 以后,WindowManagerImpl中不再保存上述的三个变量,而统一交由WindowManagerGlobal管理。
- ViewRoot与WindowManagerService的关系
ViewRootImpl的内部包含了一个IWindowSession的对象
static IWindowSession sWindowSession;
ViewRoot通过WMS提供的openSession接口创建一个连接,同时也会通过IWindowSession.add()方法提供一个IWindow对象,WMS可以使用这个Binder类型的对象与ViewRoot进行通信。
1.2 Activity中View Tree的创建过程
同其他组件不同,Activity的内部拥有完整的界面显示机制。下图先展示了这一过程,再对其中的具体步骤进行详细的介绍。
step1.ActivityThread是应用程序的主线程,当收到AMS发出的启动Activity的消息时,会调用handleLaunchActivity,这是整个ViewTree建立的起点。
setp2: 在handleLaunchActivity内部,包含了两个步骤
- performLaunchActivity
frameworks/base/core/java/android/app/ActivityThread.java
@Override
public Activity handleLaunchActivity(ActivityClientRecord r,
PendingTransactionActions pendingActions, Intent customIntent) {
... ...
WindowManagerGlobal.initialize();
final Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
r.createdConfig = new Configuration(mConfiguration);
reportSizeConfigurations(r);
if (!r.activity.mFinished && pendingActions != null) {
pendingActions.setOldState(r.state);
pendingActions.setRestoreInstanceState(true);
pendingActions.setCallOnPostCreate(true);
}
} else {
try {
ActivityManager.getService()
.finishActivity(r.token, Activity.RESULT_CANCELED, null,
Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
}
return a;
}
在handleLaunchActivity中调用了performLaunchActivity方法。
frameworks/base/core/java/android/app/ActivityThread.java
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
ActivityInfo a