Activity基本类分析
先上一张类图。
Android源码分析的文章在网络上已经很多, 有些知识点阅读完之后能够基本理解其框架,但是由于不是这些代码的维护者,所以过一段时间后就忘记的差不多了,又需要反复学习。
所以在读完文章之后,自己画一下类图,梳理下流程。

①Activity继承自Context类, Context,环境上下文, 提供各种获取系统环境的方法, 比如getResource, getPackageManager, getContentProvider等
②ContextWrapper使用装饰模式, 对Context的方法通过ContextImpl类实例mBase实现, attachBaseContext方法用来把ContextImpl实例set到mBase中。
同时,此类也是Service,application类的父类。 android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作。
③ContextThemeWrapper,主要是对getTheme,setTheme操作进行了覆盖。
④Activity类,mWindow即activity用来创建一屏UI的类,mWindowManager通过mWindow.setWindowManager创建,在这里仅保存其值,方便其他类通过Activity获取。保存一个mApplication实例。
ActivityThread实例。
需要覆盖生命周期函数onXXX()函数,attach很重要,用于初始化成员变量,创建window。
⑤PhoneWindow类,即mWindow的类。 有一个DecorView类型mDecor, 继承自FrameLayout:This is the top-level view of the window。
mContentParent: ViewGroup, 属于DecorView的主content区。 在Activity的onCreate中调用setContentView(view) 即mContentParent.addView(view, params);add 到该实例形成View tree, 注意此时并不会绘制。
⑥WindowManagerImpl, 是对WindowManager类的本地实现,而该类的方法addView,removeView等是通过WindowManagerGlobal类的实例mGlobal来实现的。
⑦WindowManagerGlobal类, 有两个list类型成员mViews,mRoots,里面放的是View tree的根View数据,我的理解是app中的所有activity的顶级视图-DecorView放在里面。参看addView方法,在ActivityThread中handleResumeActivity中会被调用
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
decor.setVisibility(View.INVISIBLE);
ViewManager wm = a.getWindowManager();
WindowManager.LayoutParams l = r.window.getAttributes();
a.mDecor = decor;
l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
if (a.mVisibleFromClient) {
a.mWindowAdded = true;
wm.addView(decor, l);
}
此时触发绘制流程,也就是在activity resume的时候,参看下面流程图
。 mRoots里放的是ViewRootImpl类型, 非常重要, 负责具体画图、事件相应和与windowmanagerService交互, 这个以后再研究。
Activity的DecorView通过windowManager添加的过程:

Activity基本类分析的更多相关文章
- 1.Android常见异常:android.view.WindowLeaked 分析以及解决办法
在项目中遇到WindowManager: Activity has leaked window问题,其实在stackoverflow.com可以找到详细答案:http://stackoverflow ...
- Android笔记:触摸事件的分析与总结----TouchEvent处理机制
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320 ...
- xUtils3源码分析(一):view的绑定
概述 xUtils3是国人开发的一款功能丰富的Android快速开发框架,值得研究下.zip包下载:[ZIP]xutils主要分以下几个模块 视图绑定模块 网络请求模块 数据库模块 图片加载模块 我们 ...
- [置顶] Android源码分析-点击事件派发机制
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17339857 概述 一直想写篇关于Android事件派发机制的文章,却一直没 ...
- Android Activity全面解析
Android Activity全面解析 首先,就从Android四大组件Activity开始. 1.Activity生命周期方法完全解析 activity_lifecycle.png 1).on ...
- [ 原创 ]学习笔记- 数据在Activity之间的传递的情况
情况一:一个Activity跳转到另一个Activity时,将第一个Activity的数据传递到第二个Activity里面. 分析:当一个界面跳转到另一个界面的同时还要讲数据传递过去,这种情况需要用I ...
- Android4.2.2 Gallery2源码分析(2)——发现Gallery.java
上文中,main.xml是我直接提出来的,并没有说明是怎么找到它的,现在说明发现它的理由: 一般我们分析界面布局会用到hierarchyviewer这个工具,从工具中,我们对应到视图,最主要的视图id ...
- 【monkey测试】Fragment not attached to Activity
monkey测试跑出了一个异常: // CRASH: packgeName (pid) // Short Msg: java.lang.IllegalStateException // Long Ms ...
- get****Context各个方法分析
1 getApplicationContext分析 该方法为contextImpl类的方法,返回一个ApplicationContext.方法代码为: public Context getApplic ...
随机推荐
- <form>(表单)标签和常用的类型
1.定义和用法 <form> 标签用于为用户输入创建 HTML 表单. 表单能够包含 input 元素,比如文本字段.复选框.单选框.提交按钮等等. 表单还可以包含 menus.texta ...
- PAT甲级——A1011 World Cup Betting
With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...
- redis常见的面试题
redis和memched有什么区别,为什么单线程的redis比多线程的memched效率高 string:ky类型 hash:字典redis的哈希结构可以使你像在数据库中更新一个属性一样只修改某一项 ...
- 搭建maven聚合工程包含springboot模块
一.新建一个maven项目 二.删除src 打开pom.xml 补充标签 <packaging>pom</packaging> 新建 <module>brr- ...
- Spring Cloud Alibaba迁移指南(二):零代码替换 Eureka
自 Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态后,我们开始制作<Spring Cloud Alibaba迁移指南>系列文章,向开发者提供更多 ...
- mysql 无法存储joda time的datetime类型
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '\xAC\xED\x00\x05sr\x ...
- spring JdbcTemplate最基本的使用
package com.com.jdbctemplate; import org.springframework.jdbc.core.JdbcTemplate; import org.springfr ...
- Ocelot(二)- 请求聚合
原文:Ocelot(二)- 请求聚合 Ocelot(二)- 请求聚合与负载均衡 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/ ...
- DNS客户端配置文件/etc/resolv.conf
本来不应该把DNS客户端配置文件放在这里来说,但由于新手弟兄上网时,虽然能拔号,但不能以域名访问.究其原因是由于没有修改 /etc/resolv.conf 文件: /etc/resolv.conf 里 ...
- Go开发 之 Go如何引用github包