android主动显示流程,Activity加载显示基本流程

本文章是基于Android源码6.0讲解Activity加载显示基本流程

首先上一张图给大家一个直观的了解

bV7mwC?w=445&h=539

首先一个布局页面的加载是在Activity中的setContentView(R.layout.res)开始;

我们就从Acitvity源码中的setContentView方法入手

public void setContentView(@LayoutRes int layoutResID) {

getWindow().setContentView(layoutResID);

initWindowDecorActionBar();

}

通过源码我们可以看到layoutResID又传给了getWindow()中的setContentView(layoutResID)方法;

mWindow = new PhoneWindow(this);

public Window getWindow() {

return mWindow;

}

getWindow()返回的是PhoneWindow的对象

我们来看PhoneWindow中setContentView(layoutResID)方法

PhoneWindow是一个隐藏类,在源码sources/andorid-23/com/android/internal/policy中

PhoneWindow中setContentView方法

@Override

public void setContentView(int layoutResID) {

if (mContentParent == null) {

installDecor();//Activity新创建时mContentParent 为空,调用installDecor方法

} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {

mContentParent.removeAllViews();

}

if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {

final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,

getContext());

transitionTo(newScene);

} else {

mLayoutInflater.inflate(layoutResID, mContentParent);

}

mContentParent.requestApplyInsets();

final Callback cb = getCallback();

if (cb != null && !isDestroyed()) {

cb.onContentChanged();

}

}

我们来看PhoneWindow中installDecor()方法中的关键部分

private void installDecor() {

if (mDecor == null) {

mDecor = generateDecor(); //@1

mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

mDecor.setIsRootNamespace(true);

if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0) {

mDecor.postOnAnimation(mInvalidatePanelMenuRunnable);

}

}

if (mContentParent == null) {

mContentParent = generateLayout(mDecor); //@2

...

}

mLayoutInflater.inflate(layoutResID, mContentParent);//@3

}

在PhoneWindow源码中声明了 private DecorView mDecor;

DecorView 是PhoneWindow中的一个内部类继承了FrameLayout,是一个帧布局

private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {

...

}

@1 首先调用mDecor = generateDecor();返回的是一个 DecorView的对象,这就是所有页面的跟布局

protected DecorView generateDecor() {

return new DecorView(getContext(), -1);

}

@2 其次调用mContentParent = generateLayout(mDecor);

protected ViewGroup generateLayout(DecorView decor) {

...

} else if ((features & (1 << FEATURE_ACTION_MODE_OVERLAY)) != 0) {

layoutResource = R.layout.screen_simple_overlay_action_mode;

} else {

// Embedded, so no decoration is needed.

layoutResource = R.layout.screen_simple;

// System.out.println("Simple!");

}

View in = mLayoutInflater.inflate(layoutResource, null);

decor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));

mContentRoot = (ViewGroup) in;

ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);

...

return contentParent;

}

这里的layoutResource是源码中的布局,我们来看一下R.layout.screen_simple

在sdk/platforms/android-23/data/res/layout路径中

android:layout_width="match_parent"

android:layout_height="match_parent"

android:fitsSystemWindows="true"

android:orientation="vertical">

android:inflatedId="@+id/action_mode_bar"

android:layout="@layout/action_mode_bar"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:theme="?attr/actionBarTheme" />

android:id="@android:id/content"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:foregroundInsidePadding="false"

android:foregroundGravity="fill_horizontal|top"

android:foreground="?android:attr/windowContentOverlay" />

R.layout.screen_simple就是一个简单的线性布局,通过mLayoutInflater.inflate和decor.addView添加到DecorView中,

再通过ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);把R.layout.screen_simple中id

为id/content的Framelayout赋值给contentParent

@3 最后通过mLayoutInflater.inflate(layoutResID, mContentParent);把我们写的布局添加到mContentParent中。

未完待续...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VIM之Project 项目管理工具

VIM是Linux和Unix下常用的文本编辑工具&#xff0c;在编写代码和阅读代码中经常使用。但VIM进行代码项目管理时&#xff0c;没有IDE集成开发工具方便&#xff0c;现在提供一个VIM插件Project&#xff0c;可以对代码项目进行简单的集中管理一、 下载安装1、 在 Vim 网站上下载最…

WPF DataGrid 通过自定义表头模拟首行固定

WPF DataGrid 通过自定义表头模拟首行固定独立观察员 2021 年 9 月 25 日最近工作中要在 WPF 中做个表格&#xff0c;自然首选就是 DataGrid 控件了。问题是&#xff0c;UI 设计的表格是在首行有一个新增按钮&#xff0c;那一行样式和其它数据行是一样的&#xff0c;就在表头下…

python和C语言分别实现插入排序

python语言代码&#xff1a;代码1 defInsertSort(numbers,n):2 fori inrange(1,n):3 j i-14 tem numbers[i]5 whilenumbers[j]>tem andj>0:6 numbers[j1] numbers[j]7 j -18 else:9 numbers[j1] tem10 print"Onthe sort:",numbers11 12 a [9,8,7,6,5,4,3,2,1,0…

Windows用户安全小技巧

本文适用于具有管理员用户和标准用户的所有Windows系统&#xff0c;如Windows 2000以上的操作系统&#xff0c;UAC是Windows Vista以上版本的具有功能。新安装的Windows系统或者新购买的含有Windows系统计算机一开始都需要安装许多软件并需要设置较多的含有Windows安全或用户控…

从网恋到失恋只需要一秒...

1 原来放下一个人如此简单...▼2 而且到现在衣服都没找到▼3 这东西叫糖醋液&#xff0c;实验室比例是&#xff1a;糖&#xff1a;醋&#xff1a;酒&#xff1a;水1&#xff1a;2&#xff1a;3&#xff1a;4▼4 老师&#xff1a;这孩子真有原则▼5 呵&#xff0c;绝交吧▼…

大前端快闪:package.json文件知多少?

最近在公司某项目参与了一些前端工作&#xff0c;作为后端抠脚大汉&#xff0c;改点前端细节磕磕绊绊&#xff0c;改点大前端、工程化、HTTP交互倒也还能做到柳暗花明。于是打算用后端程序猿的视角记录一些{大前端}的知识快闪&#xff0c;也算是帮助读者构建完整的全栈技能体系…

大牛C++编程开发学习建议50条

2019独角兽企业重金招聘Python工程师标准>>> 每个从事C开发的朋友相信都能给后来者一些建议&#xff0c;但是真正为此进行大致总结的很少。本文就给出了网上流传的对C编程开发学习的50条建议&#xff0c;总结的还是相当不错的&#xff0c;编程学习者&#xff08;不仅…

html2canvas改成同步,html2canvas转为图片异步转同步问题(记录)

描述&#xff1a;最近使用html2canvas插件截取页面上指定dom为图片&#xff0c;然后将生成的图片替换页面上的dom后&#xff0c;将替换后的页面内容保存至数据库&#xff0c;结果保存的是保存前的页面&#xff0c;初步判定是html2canvas的异步执行造成的。参考了两篇博文&#…

杨辉再发声明:没有及时交流工作进展,深表歉意

全世界只有3.14 % 的人关注了爆炸吧知识pixabay.com编者按加州大学付向东教授实名举报中科院上海神经所杨辉事件在过去一周成为学术界讨论的热点话题。付向东称自己2018年在神经所做学术报告后&#xff0c;杨辉重复其实验却未告知并抢发文章。杨辉7月3日发表声明&#xff0c;称…

z变换公式表_如何使用标准正态分布表?

正态分布这个概念在统计学中很常见&#xff0c;在做与正态分布有关计算的时候经常会用到标准正态分布表。如果知道一个数值的标准分数即z-score&#xff0c;就可以非常便捷地在标准正态分布表中查到该标准分数对应的概率值。任何数值&#xff0c;只要符合正态分布的规律&#x…

.NET 6 中的 ConfigurationManager

.NET 6 中的 ConfigurationManagerIntro.NET 6 为了 Minimal API 引入了一些新东西&#xff0c;其中就包含了一个全新的配置对象 ConfigurationManager这并不是 .NET Framework 里的静态类 ConfigurationManager&#xff0c;而是 .NET Core 里的配置 Microsoft.Extensions.Conf…

60个高质量的CSS、XHTML网页布局模板下载

无论您下载和解剖预建模板是为了学习最新的CSS布局技术&#xff0c;或者下载的目的是为了易于编辑制作现成的独立网站&#xff0c;您都不应该仅限于免费且可用的一个拥有众多克隆版本、陈旧的且往往是枯燥的模板。网页设计的流行趋势和技术总是在千变万化&#xff0c;因此&…

总有人会偷看你的朋友圈

全世界只有3.14 % 的人关注了爆炸吧知识生活中&#xff0c;总是会有人在默默关注着你。你的朋友圈&#xff0c;常常有人来“偷偷”光顾&#xff0c;而这些细枝末节常常被我们忽视。 你不想让关心你的人失望&#xff0c;于是在朋友圈分享优质文章&#xff0c;希望你的快乐…

关于tomcat的使用方法(配置及使用)

前一段时间要做一个音乐播放器&#xff0c;要实现在线下载歌曲功能&#xff0c;这里要用到服务器&#xff0c;我决定使用Tomcat。 1.下载tomcat http://tomcat.apache.org/ 推荐下载7.0 版本&#xff08;8.0刚出来&#xff0c;据说还有些问题&#xff1b;6.0反正我没搭建好&a…

HTML5中常见的列表标签包括,介绍几个常用的HTML5标签

一、Html的基本结构&#xff1a;网页的文本、图片等信息&#xff1b;二、Head部分&#xff1a;用于表示网页的元数据即描述网页的基本信息其常用标签及属性有&#xff1a;1、title标签&#xff1a;浏览器标签页显示的标题2、meta标签&#xff1a;其常用属性①charset:设置文档的…

正弦波 程序 角度传感器_激光位移传感器的原理及应用领域

激光位移传感器是利用激光技术进行测量的传感器&#xff0c;由激光器、激光检测器和测量电路组成。作为新型测量设备&#xff0c;激光位移传感器能够精确非接触测量被测物体的位置、位移等变化&#xff0c;还可测量位移、厚度、振动、距离、直径等精密的几何测量。目前&#xf…

Dapr牵手.NET学习笔记:状态管理之docker-compose发布

Dapr牵手.NET学习笔记&#xff1a;想入非非的服务调用Dapr牵手.NET学习笔记&#xff1a;跨物理机负载均衡服务调用Dapr牵手.NET学习笔记&#xff1a;用docker-compose部署服务说明&#xff1a;为了给出demo的全貌&#xff0c;这篇有点长&#xff0c;如果有上一篇的基础&#xf…

linux tomcat 启动权限不足解决办法

2019独角兽企业重金招聘Python工程师标准>>> 用命令 chmod 755 文件名 即可 转载于:https://my.oschina.net/pioneeer/blog/10374

她在哭,但我没资格安慰她......​

1 我没资格安慰她......▼2 妈妈的关心总是突如其来▼3 突然就热得离谱了▼4 当贾玲和沈腾开始演起韩剧▼5 有些菜一旦错过就不在▼6 这要不是德高望重的长老还真带不了这样的帽子▼7 连狗都比你会放风筝▼你点的每个赞&#xff0c;我都认真当成了喜欢

指定的文件不是虚拟磁盘 没有快照_vmware workstaiton 15 虚拟机克隆(4)

安装客户机操作系统和应用程序可能要耗费很多时间。通过使用克隆&#xff0c;您可以通过一次安装及配置过程制作很多虚拟机副本。克隆虚拟机比复制虚拟机更简单、更快速。当您需要将多个相同的虚拟机部署到一个组时&#xff0c;克隆功能会非常有用。例如&#xff0c;MIS 部门可…