2.PhoneWindow里有一个DecorView,这个DecorView就是一个FrameLayout,是整个Activity的根布局
3.当新建Activity时选择不同的主题会有不同的根布局
4.比如选择的是空白的Activity,那就是分为两部分ViewStub预留和FrameLayout 这个FrameLayout就是root
5.自己写的布局就是挂在View temp下面
Activity框架
第4.5步:generateLayout()加载主题布局
ActivityThread.java
先从ActivityThread.java这个类开始看
- performLaunchActivity(翻译 执行启动Activity)
在performLaunchActivity方法中
2. 先建Context 根据createBaseContextForActivity
3. 根据Context获取ClassLoader getClassLoader()
4. 根据ClassLoader 新建出一个Activity newActivity
补充:mInstrumentation(翻译 仪器)
这里存了activity的基本信息,创建activity啥的都在这
-
建了一个Window,并将它与activity关联
-
将Window传入了activity.attach()
- 在activity.attach()里,其实是将window传入,new 了一个 PhoneWindow
- 最后是通过callActivityOnCreate 将activity初始化并执行
PhoneWindow.java
在ActivityThread.java的performLaunchActivity方法中,是创建activity的主流程,其中建了一个Window,并将它与activity关联,而这个Window又传入了activity.attach(),new了一个PhoneWindow.java
-
先看setContentView(int layoutResID)
-
setContentView里重要的就两步:①installDecor() 初始化DecorView ②mLayoutInflater.inflate(layoutResID, mContentParent)(加载XML布局)
installDecor()
-
初始化DecorView,这里的mContentParent其实就是DecorView
-
将DecorView传入generateLayout()生成布局
1.1 generateDecor里就是直接return了new DecorView
- onResourcesLoaded加载资源
3.1 onResourcesLoaded()方法里,其实调用了inflater.inflate()来生成View,然后addView添加到父布局下面
mLayoutInflater.inflate() - LayoutInflater.java
- LayoutInflater.inflate()就是用来加载xml的
- View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot)三个参数分别是 XML解析器、父布局的类型、是否要添加到父布局下面(详情看第四步)
attachToRoot 用到的地方
- 查看inflate方法,重点方法 createViewFromTag()创建View。
3.1 查看 createViewFromTag() 方法,如果有mFactory、mFactory2、mPrivateFactory就走Factory的onCreateView,不然就走系统的onCreateView
重点中的重点!!! 因为这里是这样构造view的,所以可以通过自定义的Factory或者Factory2,来使构造View的代码走我们自己的,这样就可以实现 -- 插件化换肤
还有一种方法就是直接给LayoutInflate.java这一整个类都给替换了 -- 插件化换肤
3.2 系统的onCreateView其实是根据反射来创建的
①根据name创建constructor 构造器(之前见过的先从HashMap的缓存里取,没取到才自己创建)
②通过构造器创建View View view = constructor.newInstance(args);
③补充:因为View是通过反射constructor.newInstance(args)创建的所以这时候其实View是空的,在xml里写的各种属性都是没有的
①反射获取constructor
② constructor.newInstance(args); 构建View
③ 补充这时候xml的属性都是空的
- 因为第三步,View创建是通过反射的,所以现在xml里自己写的属性还是没有的,所以得通过获取 LayoutParams在将属性设置给View
- View有了(反射),属性也设置了,也添加到布局树下面了 root.addView(temp, params),所以view就构建完事了
刚刚上面的全都是Activity的加载流程,下面看资源的加载流程
Resoureces的结构图
1.ResourcesManager管理着一个Resources类
2.Resources类里有他的实现类ResourcesImpl,各种创建,调用,getColor等方法都是在实现类里实现的
3.ResourcesImpl里管理着一个AssetManager
4.AssetManager负责从apk里获取资源,写入资源等 addAssetPath()
resources.arsc这个文件就是apk中存资源的(字典表),addAssetPath()取的就是他的值
handleBindApplication()–ActivityThread.java
- 起点是ActivityThread.java handleBindApplication()方法 ,在这加载Application的
- 先new了一个Instrumentation(翻译仪表),这个类是用来加载Activity的
- 生产了makeApplication,然后调用了Application.onCreate();
makeApplication()-- LoadedApk.java
先看Application的生产过程
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。
技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;
我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
(img-gn2UrBg2-1712330092496)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!