android主动显示流程,Activity加载显示基本流程
本文章是基于Android源码6.0讲解Activity加载显示基本流程
首先上一张图给大家一个直观的了解
首先一个布局页面的加载是在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中。
未完待续...
android主动显示流程,Activity加载显示基本流程相关推荐
- Android 使用imageLoader来加载显示图片
简介 Android上最让人头疼的莫过于从网络获取图片.显示.回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你.Universal Image Loader for Android的目的 ...
- Android 四大组件之——Acitivity(四) Activity是如何加载显示内容的?
1. 在Activity调用onCreate()等生命周期之前,Activity会调用attach()方法,而在attach()方法中会调用如下代码 onAttach() {PolicyManager ...
- 【Android优化篇】提升Activity加载速度的方法
文章转自:http://www.jianshu.com/p/2007ca0290d3 作者: CoderFan 前言 这个也是我面试遇到的问题,当时只回答了一种情况,异步加载数据,没想到别的方式,回来 ...
- Android使用Glide框架加载网络图片(解决无报错图片不显示问题)
清单文件中添加访问网络权限并防止图片不显示 activity加载自己云服务器网页图片 package com.example.app3;import androidx.appcompat.app.Ap ...
- android listview动态加载网络图片不显示,Android Listview异步动态加载网络图片
Android Listview异步动态加载网络图片 详见: http://blog.sina.com.cn/s/blog_62186b460100zsvb.html 标签: Android SDK ...
- android 加载显示富文本——TextView显示富文本和WebView显示富文本,WebView显示图片适配屏幕宽度
TextView加载显示 添加依赖 implementation 'com.zzhoujay.richtext:richtext:3.0.8' implementation 'com.zzhoujay ...
- Android端加载显示高分辨率卫星地图
Android端加载显示高分辨率卫星地图 *哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 * 使用天地图卫星地图在arcgis环境下加载高清卫星地图,该部分仅简单提供成功加载显示天地图卫星图层 ...
- android动态图片适配,Android适配利用webview加载后图片显示过大的问题解决
前言 最近在开发过程中,需要用webview控件来展示文章的详情页面,流程是通过请求后台数据,然后用控件加载,而后台返回的文章详情页面是直接网页端使用的,并没有对移动端进行适配,导致webview加载 ...
- Android 进阶:网络图片加载 - Glide篇
概述: Glide官网 Glide是一个快速高效的Android图片加载库,注重于平滑的滚动.Glide提供了易用的API,高性能.可扩展的图片解码管道(decode pipeline),以及自动的资 ...
最新文章
- 技术直播:讲一个Python编写监控程序的小故事
- 如何让自己在云服务器上部署的项目一直运行
- 网站访问慢解决思路详细图解
- PKU ACM 1258 Agri-Net http://acm.pku.edu.cn/JudgeOnline/problem?id=1258
- 利用SQL模糊匹配来验证字段是否是日期格式
- Kafka的producer案例,Kafka的consumer案例
- 冲刺阶段——Day5
- openssl构建CA认证
- Biopython SeqIO 读取序列文件,读取信息,写入序列
- 445.两数相加II
- java大数阶乘_Java大数阶乘
- 代挂管家易开源7.4+web版
- 微信小程序实现倒计时
- 最全移动端UI设计规范,作为前端的你,了解多少?
- 不知道怎么去视频水印,看看这些怎样去水印教程
- NYOJ - [第八届河南省程序设计大赛]Distribution(水题)
- 微软Skype智能聊天机器人现登陆Mac平台和网页版
- arcgis制作瓦片地图_一种GIS瓦片地图的存储方式的制作方法
- unity3d做俄罗斯方块
- 电机磁电热多场耦合 matlab,永磁电机电磁-温度场耦合仿真分析流程
热门文章
- netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源
- Ocelot(六)- 架构图
- C#并行编程(3):并行循环
- Docker最全教程——从理论到实战(二)
- 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题
- 为什么要使用Entity Framework
- ASP.NET Core中的OWASP Top 10 十大风险-失效的访问控制与Session管理
- get√—搜索微信公众号【Dotnet跨平台】指定文章的办法
- 第四篇 Entity Framework Plus 之 Batch Operations
- ABP框架搭建项目系列教程基础版