美文网首页
Android 中 activity、window、view 三

Android 中 activity、window、view 三

作者: FelixLiuu | 来源:发表于2019-07-15 11:05 被阅读0次

    Activity

    ContextImpl -> startActivity-> scheduleLaunchActivity(AMS) 到最后 ActivityThread.performLaunchActivity -> Activity.attach中创建出PhoneWindow。

    Activity并不负责视图控制,它只是控制生命周期和处理事件。真正控制视图的是Window。一个Activity包含了一个Window,Window才是真正代表一个窗口。

    Activity就像一个控制器,统筹视图的添加与显示,以及通过其他回调方法,来与Window、以及View进行交互。

    Window

    ActivityThread.performLaunchActivity -> Activity.attach中初始化了Window。

    表示一个窗口的概念,是所有View的直接管理者,任何视图都通过Window呈现(点击事件由Window->DecorView->View; Activity的setContentView底层通过Window完成)

    Window是一个抽象类,具体实现是PhoneWindow。PhoneWindow中有个内部类DecorView,通过创建DecorView来加载Activity中设置的布局

    创建Window需要通过WindowManager创建,通过WindowManager将DecorView加载其中,并将DecorView交给ViewRoot,进行视图绘制以及其他交互

    Window具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是通过IPC完成

    View

    View 的顶级根节点是 DecorView,DecorView 是 FrameLayout的子类。

    执行Activity的setContentView方法,内部是调用PhoneWindow的setContentView方法,在PhoneWindow中完成DecorView的创建。流程

    1、Activity中的setContentView
    2、PhoneWindow中的setContentView
    3、PhoneWindow中的installDecor

    Window 的 实例对象 WindowManager 添加 DecorView,并将 DecorView 交给 ViewRootImpl,ViewRootImpl 是 WindowManager 和 DecorView 的纽带,在起 performTraversals()方法中绘制 View。

    总结

    Activity 在 performLaunchActivity-> attach 时创建Window(PhoneWindow),在 setContentView 时创建DecorView。执行到 ActivityThread.handleResumeActivity 的 makeVisible是将 DecorView 添加到 WindowManager中,并创建 ViewRootImpl,将 DecorView 对象交给 ViewRootImpl,ViewRootImpl通过Handler向主线程发送了一条触发遍历操作的消息:performTraversals();该方法用于执行View的绘制流程(measure、layout、draw)

    参考

    DecorView创建
    ViewRoot Window简介

    相关文章

      网友评论

          本文标题:Android 中 activity、window、view 三

          本文链接:https://www.haomeiwen.com/subject/ttwykctx.html