先上一张类图。

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. 1.Android常见异常:android.view.WindowLeaked 分析以及解决办法

    在项目中遇到WindowManager: Activity  has leaked window问题,其实在stackoverflow.com可以找到详细答案:http://stackoverflow ...

  2. Android笔记:触摸事件的分析与总结----TouchEvent处理机制

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320   ...

  3. xUtils3源码分析(一):view的绑定

    概述 xUtils3是国人开发的一款功能丰富的Android快速开发框架,值得研究下.zip包下载:[ZIP]xutils主要分以下几个模块 视图绑定模块 网络请求模块 数据库模块 图片加载模块 我们 ...

  4. [置顶] Android源码分析-点击事件派发机制

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17339857 概述 一直想写篇关于Android事件派发机制的文章,却一直没 ...

  5. Android Activity全面解析

    Android Activity全面解析 首先,就从Android四大组件Activity开始. 1.Activity生命周期方法完全解析   activity_lifecycle.png 1).on ...

  6. [ 原创 ]学习笔记- 数据在Activity之间的传递的情况

    情况一:一个Activity跳转到另一个Activity时,将第一个Activity的数据传递到第二个Activity里面. 分析:当一个界面跳转到另一个界面的同时还要讲数据传递过去,这种情况需要用I ...

  7. Android4.2.2 Gallery2源码分析(2)——发现Gallery.java

    上文中,main.xml是我直接提出来的,并没有说明是怎么找到它的,现在说明发现它的理由: 一般我们分析界面布局会用到hierarchyviewer这个工具,从工具中,我们对应到视图,最主要的视图id ...

  8. 【monkey测试】Fragment not attached to Activity

    monkey测试跑出了一个异常: // CRASH: packgeName (pid) // Short Msg: java.lang.IllegalStateException // Long Ms ...

  9. get****Context各个方法分析

    1 getApplicationContext分析 该方法为contextImpl类的方法,返回一个ApplicationContext.方法代码为: public Context getApplic ...

随机推荐

  1. WhaleCTF之web-http呀

    WhaleCTF之web-http呀 前往题目 不多说,看看源码 源码没有,抓包,发一下,也没有 猜测不是这个页面 burp抓包,把html改成php 发一下,在返回源码看到flag~

  2. sort方法

    作用:对列表进行排序 >>> spam=[2,5,3,14,1,-7] >>> spam.sort() >>> spam [-7, 1, 2, 3 ...

  3. LINUX查询用户命令

    W 可显示开机多久,当前登录的所有用户,平均负载 Who 显示当前登录的所有用户 Last 显示每个用户最后的登录时间 Lastlog 显示每个用户最后的登录时间

  4. Luogu P2680 运输计划(二分+树上差分)

    P2680 运输计划 题意 题目背景 公元\(2044\)年,人类进入了宇宙纪元. 题目描述 公元\(2044\)年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道 ...

  5. js中的观察者模式与发布者/订阅者模式的区别?

  6. NDK(23) 使用CMake 构建 c/c++代码库

    1.官网 https://developer.android.com/studio/projects/add-native-code.html 2.android studio 安装相关工具 在打开的 ...

  7. 洛谷1850(NOIp2016) 换教室——期望dp

    题目:https://www.luogu.org/problemnew/show/P1850 状态里记录的是”上一回有没有申请“,而不是”上一回申请成功否“,不然“申请 j 次”就没法转移了. dou ...

  8. Jquery 判断值是否存在于数组之内

    var strArray=str.split(","); var fixed_init=function(v){ if($.inArray(v,strArray)==-1){ // ...

  9. Java review-basic4

    1. HashMap vs HashTable vs ConcurrentHashMap 1). Thread -Safe : ConcurrentHashMap is thread-safe tha ...

  10. python基础--递归、三元表达式、列表(字典)生成式、匿名函数、常用的内置函数

    函数的递归:函数在调用阶段直接或者间接的又调用自身 递归的两个阶段: 1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都是应该下降的,直接有一个最终的结束条件(这个结束条 ...