注意:鄙人看的是6.0的代码

Activity里面还是调用了WindowManager来显示界面。在activity的738行,有这几行代码

private Window mWindow;

private WindowManager mWindowManager;

/*package*/ View mDecor = null; //这就是activity的主view,我也不知道怎么表达会比较好 = =

平常用的setContentView方法,最终是调用了mWindow来处理的。

public void setContentView(@LayoutRes int layoutResID) {

getWindow().setContentView(layoutResID);

initWindowDecorActionBar();

}

mWindow其实一个 PhoneWindow对象,在6169行的attach方法可是看到它的初始化

final void attach(Context context, ActivityThread aThread,

Instrumentation instr, IBinder token, int ident,

Application application, Intent intent, ActivityInfo info,

CharSequence title, Activity parent, String id,

NonConfigurationInstances lastNonConfigurationInstances,

Configuration config, String referrer, IVoiceInteractor voiceInteractor) {

attachBaseContext(context);

mFragments.attachHost(null /*parent*/);

mWindow = new PhoneWindow(this);//我在这里

mWindow.setCallback(this);

mWindow.setOnWindowDismissedCallback(this);

mWindow.getLayoutInflater().setPrivateFactory(this);

...

}

其中mWindowManager是通过mWindow来实现初始化

mWindowManager = mWindow.getWindowManager();

接着看看activity是怎么调用mWindowManager来显示界面,在源码第4772行,可以看到一个setVisible方法,这就是activity展示界面的入口吧

public void setVisible(boolean visible) {

if (mVisibleFromClient != visible) {

mVisibleFromClient = visible;

if (mVisibleFromServer) {

if (visible) makeVisible();//我将要展示界面

else mDecor.setVisibility(View.INVISIBLE);

}

}

}

接着看看makeVisible方法是怎么调用mWindowManager来显示界面。没错,其实就是用addview来显示界面。

void makeVisible() {

if (!mWindowAdded) {

ViewManager wm = getWindowManager();

wm.addView(mDecor, getWindow().getAttributes());

mWindowAdded = true;

}

mDecor.setVisibility(View.VISIBLE);

}

为什么activity能通过android:configChanges="orientation|keyboardHidden" ,能保证界面不重建呢,我们可以看到源码还有一个onWindowAttributesChanged方法。

public void onWindowAttributesChanged(WindowManager.LayoutParams params) {

// Update window manager if: we have a view, that view is

// attached to its parent (which will be a RootView), and

// this activity is not embedded.

if (mParent == null) {

View decor = mDecor;

if (decor != null && decor.getParent() != null) {

getWindowManager().updateViewLayout(decor, params);

}

}

}

我估计是用了updateViewLayout来刷新页面,单纯看到这里,activity是怎么监听屏幕旋转呢?

android代码旋转屏幕,Android Activity源码分析--windowmanager屏幕旋转研究相关推荐

  1. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | 任务检查 | 任务执行 )

    文章目录 一.回调 StateChangedListener 接口 二.JobHandler 处理 ( 任务检查 ) 三.maybeRunPendingJobsH 方法 四.assignJobsToC ...

  2. Android 9 (P) Zygote进程启动源码分析指南二

         Android 9 Zygote进程启动源码分析指南二 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...

  3. android字符显示流程图,Android应用层View绘制流程与源码分析

    1  背景 还记得前面<Android应用setContentView与LayoutInflater加载解析机制源码分析>这篇文章吗?我们有分析到Activity中界面加载显示的基本流程原 ...

  4. Android应用层View绘制流程与源码分析

    前言 Activity中界面加载显示的基本流程原理,最终分析结果就是下面的关系: 看见没有,如上图中id为content的内容就是整个View树的结构,所以对每个具体View对象的操作,其实就是个递归 ...

  5. 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )

    文章目录 一.ConnectivityController 连接控制器引入 二.ConnectivityController 构造方法解析 ( 注册接收者 ) 三.mConnectivityRecei ...

  6. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 )

    文章目录 一.JobScheduler 提交任务 schedule 方法源码分析 二.schedule(JobInfo job, int uId) 方法 三.scheduleAsPackage 方法 ...

  7. 用android代码显示图片的一部分源码

    ShowPoritionPictureActivity代码: [java] <span style="font-size:16px;"> package com.iwi ...

  8. android的消息处理机制(图+源码分析)——Looper,Handler,Message

    android源码中包含了大量的设计模式,除此以外,android sdk还精心为我们设计了各种helper类,对于和我一样渴望水平得到进阶的人来说,都太值得一读了.这不,前几天为了了解android ...

  9. 【转】android的消息处理机制(图+源码分析)——Looper,Handler,Message

    原文地址:http://www.cnblogs.com/codingmyworld/archive/2011/09/12/2174255.html#!comments 作为一个大三的预备程序员,我学习 ...

最新文章

  1. 为什么对高斯分布的方差的极大似然估计是有偏的?
  2. 我的世界java下载1.13_Minecraft Java版 1.13.1-pre2 发布
  3. 语音合成系统之pyWORLD,WORLD使用简介
  4. 如何将CSDN文档输出PDF文件?
  5. python opencv 实现任意角度的透视变换
  6. 微信支付在巴黎发布“智慧生活零时差”全球战略
  7. IDEA 集成Lombok 插件-安装插件
  8. html省市区选择器代码,js实现一个省市区三级联动选择框代码分享
  9. JavaScript高级之构造函数和原型
  10. mysql 密码修改时间_Mysql修改密码的方法
  11. oracle无法远程安装,docker部署Oracle,无法远程连接(已解决)
  12. 重磅!清华商汤开源CVPR2018超高精度人脸对齐算法LAB
  13. 手把手教你写网站:Python WEB开发技术实战
  14. 桃李春风一杯酒,江湖夜雨十年灯
  15. 软件测试文档测试用例,软件测试用例文档模板(带实例)
  16. Windows10操作系统搭建C语言开发环境
  17. excel文件修复工具_ArcGIS工具箱使用技巧汇总
  18. win10 企业版激活
  19. 三菱凌云3故障代码_上海三菱凌云2故障代码
  20. 朱松纯将回国加入清华,曾对李飞飞创建ImageNet有启示

热门文章

  1. 详细设计说明书示例_专利说明书常用句型汇总
  2. echart的进阶使用(option)
  3. mysql to mssql_MysqlToMsSql
  4. mysql云数据库 磁盘利用率_云数据库MySQL参数的那些事儿
  5. [UE4]C++静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()
  6. Qt中translate、tr关系 与中文问题
  7. 详细解析Linux /etc/passwd文件
  8. python网络爬虫_Python爬虫实战之网络小说
  9. python免费学校_清华大学,的python学习路线,免费分享给小白福利
  10. 卸载idea_IDEA 不为人知的 5 个骚技巧!真香!