本文章是基于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中。

未完待续...

android主动显示流程,Activity加载显示基本流程相关推荐

  1. Android 使用imageLoader来加载显示图片

    简介 Android上最让人头疼的莫过于从网络获取图片.显示.回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你.Universal Image Loader for Android的目的 ...

  2. Android 四大组件之——Acitivity(四) Activity是如何加载显示内容的?

    1. 在Activity调用onCreate()等生命周期之前,Activity会调用attach()方法,而在attach()方法中会调用如下代码 onAttach() {PolicyManager ...

  3. 【Android优化篇】提升Activity加载速度的方法

    文章转自:http://www.jianshu.com/p/2007ca0290d3 作者: CoderFan 前言 这个也是我面试遇到的问题,当时只回答了一种情况,异步加载数据,没想到别的方式,回来 ...

  4. Android使用Glide框架加载网络图片(解决无报错图片不显示问题)

    清单文件中添加访问网络权限并防止图片不显示 activity加载自己云服务器网页图片 package com.example.app3;import androidx.appcompat.app.Ap ...

  5. android listview动态加载网络图片不显示,Android Listview异步动态加载网络图片

    Android Listview异步动态加载网络图片 详见: http://blog.sina.com.cn/s/blog_62186b460100zsvb.html 标签: Android SDK ...

  6. android 加载显示富文本——TextView显示富文本和WebView显示富文本,WebView显示图片适配屏幕宽度

    TextView加载显示 添加依赖 implementation 'com.zzhoujay.richtext:richtext:3.0.8' implementation 'com.zzhoujay ...

  7. Android端加载显示高分辨率卫星地图

    Android端加载显示高分辨率卫星地图 *哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 * 使用天地图卫星地图在arcgis环境下加载高清卫星地图,该部分仅简单提供成功加载显示天地图卫星图层 ...

  8. android动态图片适配,Android适配利用webview加载后图片显示过大的问题解决

    前言 最近在开发过程中,需要用webview控件来展示文章的详情页面,流程是通过请求后台数据,然后用控件加载,而后台返回的文章详情页面是直接网页端使用的,并没有对移动端进行适配,导致webview加载 ...

  9. Android 进阶:网络图片加载 - Glide篇

    概述: Glide官网 Glide是一个快速高效的Android图片加载库,注重于平滑的滚动.Glide提供了易用的API,高性能.可扩展的图片解码管道(decode pipeline),以及自动的资 ...

最新文章

  1. 技术直播:讲一个Python编写监控程序的小故事
  2. 如何让自己在云服务器上部署的项目一直运行
  3. 网站访问慢解决思路详细图解
  4. PKU ACM 1258 Agri-Net http://acm.pku.edu.cn/JudgeOnline/problem?id=1258
  5. 利用SQL模糊匹配来验证字段是否是日期格式
  6. Kafka的producer案例,Kafka的consumer案例
  7. 冲刺阶段——Day5
  8. openssl构建CA认证
  9. Biopython SeqIO 读取序列文件,读取信息,写入序列
  10. 445.两数相加II
  11. java大数阶乘_Java大数阶乘
  12. 代挂管家易开源7.4+web版
  13. 微信小程序实现倒计时
  14. 最全移动端UI设计规范,作为前端的你,了解多少?
  15. 不知道怎么去视频水印,看看这些怎样去水印教程
  16. NYOJ - [第八届河南省程序设计大赛]Distribution(水题)
  17. 微软Skype智能聊天机器人现登陆Mac平台和网页版
  18. arcgis制作瓦片地图_一种GIS瓦片地图的存储方式的制作方法
  19. unity3d做俄罗斯方块
  20. 电机磁电热多场耦合 matlab,永磁电机电磁-温度场耦合仿真分析流程

热门文章

  1. netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源
  2. Ocelot(六)- 架构图
  3. C#并行编程(3):并行循环
  4. Docker最全教程——从理论到实战(二)
  5. 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题
  6. 为什么要使用Entity Framework
  7. ASP.NET Core中的OWASP Top 10 十大风险-失效的访问控制与Session管理
  8. get√—搜索微信公众号【Dotnet跨平台】指定文章的办法
  9. 第四篇 Entity Framework Plus 之 Batch Operations
  10. ABP框架搭建项目系列教程基础版