Activity,DecorView,PhoneWindow,WindowManager,ActivityThread,ViewRootImpl等的关系

ActivityThread中的handleLaunchActivity方法中,有performLaunchActivity

performLaunchActivity() {
    // 伪代码
    Activity activity = new Activity();
    activity.attatch(); // 创建了Phonewindow,获得了WindowMananger服务
    activity.setTheme(); // 设置Theme
    mInstrumentation.callActivityOnCreate(); // 调用了activity.performCreate()
    activity.performStart(); //通过mInstrumentation调用onStart
}

Activity的调用setContentView:

setContentView() {
  getWindow().setContentView(); // 上面已经创建好了PhoneWindow
}

PhoneWindow的setContentView:

setContentView() {
  installDecor(); // 创建了DecorView
  mLayoutInflater.inflate(layoutResID, mContentParent); // 将activity的布局放入mContentParent中
}

PhoneWindow的installDecor:

installDecor() {
  mDecor = generateDecor(); // new了一个DecorView,并设置了window,就是上面的phoneWindow
  mContentParent = generateLayout(mDecor); // 得到mContentParent
}

PhoneWindow的generateLayout

generateLayout() {
// 确定layoutResource
    mDecor.onResourcesLoaded(mLayoutInflater, layoutResource);
    ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);
}

DecorView的onResourcesLoaded

onResourcesLoaded() {
    final View root = inflater.inflate(layoutResource, null);
    addView(root, 0, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); // 添加View
    mContentRoot = (ViewGroup) root; // 设置mContentRoot
}

那么ViewRootImpl在哪里呢?最后发现,View里面有一个方法getViewRootImpl,用于获取

public ViewRootImpl getViewRootImpl() {
   if (mAttachInfo != null) {
       return mAttachInfo.mViewRootImpl;
   }
   return null;
}

在WindowManagerGlobal的addView方法里,new了一个ViewRootImpl

WindowManagerImpl implements WindowManager
,其中有一个成员变量,WindowManagerGlobal,它的addView:

public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
    applyDefaultToken(params);
    mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
}

是在哪里调用的呢?搜索发现很多地方都在调用(但其实大部分搜索结果是View的addView方法,而不是wm的),比如:
1.ActivityThread里handleResumeActivity有调用
wm.addView(decor, l); // 很显然是resume的时候嘛
2.Activity的makeVisible方法有调用
ActivityRecord.java
ActivityStack.java
ActivityStackSupervisor.java
上面这几个类里都有用到setVisible,具体需要再排查,或者这第二种情况用的本来就不多,通常情况还是通过第一种情况调用的wm的addView
我的理解是ViewRootImpl牵扯到一些交互,在显示给用户的时候,应该创建出来了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在计算机科学的早期,硬件,软件,编译器和操作系统的交互非常简单,使学生能够全面了解计算机的工作原理。随着计算机技术的日益复杂化以及由此产生的知识专业化,这种清晰度常常会丢失。与仅涉及该领域的一个方面的其他文本不同,计算系统的要素为学生提供了应用计算机科学的综合和严谨的图像,因为它在构建简单但功能强大的计算机系统中发挥作用。 实际上,理解计算机如何工作的最好方法是从头开始构建一个,这本教科书引导学生完成十二章和逐步构建基本硬件平台和现代软件层次结构的项目。在此过程中,学生将获得有关硬件架构,操作系统,编程语言,编译器,数据结构,算法和软件工程的实践知识。使用这种建设性的方法,本书展示了大量的计算机科学知识,并演示了其他课程中教授的理论和应用技术如何适合整体情况。 本书旨在支持一学期或两学期的课程,基于抽象 - 实施范式; 每一章都提供了一个关键的硬件或软件抽象,一个具体的提议实现,以及一个实际的项目。新兴的计算机系统可以按照章节来构建,尽管这只是一个选项,因为项目是自包含的,可以按任何顺序完成或跳过。完成项目所需的所有计算机科学知识都嵌入在书中,唯一的先决条件是编程经验。 本书的网站提供了构建文中描述的所有硬件和软件系统所需的所有工具和材料,包括12个项目的200个测试程序。可以修改项目和系统以满足各种教学需求,并且所有提供的软件都是开源的

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值