《深入理解Android》学习-View体系

《深入理解Android》学习-View体系(一)

SurfaceFlinger和WMS支撑起了Android的GUI的底层,但是和终端用户直接交互的还是View系统,本节将对View系统进行介绍,主要描述view的管理以及绘制过程。

1.1 View框架

下图是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(Activ
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值