Activity布局流程+资源加载过程+插件化换肤思路,面试阿里P7岗

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这个类开始看

  1. performLaunchActivity(翻译 执行启动Activity)

在performLaunchActivity方法中

2. 先建Context 根据createBaseContextForActivity

3. 根据Context获取ClassLoader getClassLoader()

4. 根据ClassLoader 新建出一个Activity newActivity image.png

补充:mInstrumentation(翻译 仪器)

这里存了activity的基本信息,创建activity啥的都在这

  1. 建了一个Window,并将它与activity关联

  2. 将Window传入了activity.attach()

image.png

  1. 在activity.attach()里,其实是将window传入,new 了一个 PhoneWindow

  1. 最后是通过callActivityOnCreate 将activity初始化并执行

PhoneWindow.java

在ActivityThread.java的performLaunchActivity方法中,是创建activity的主流程,其中建了一个Window,并将它与activity关联,而这个Window又传入了activity.attach(),new了一个PhoneWindow.java

  1. 先看setContentView(int layoutResID)

  2. setContentView里重要的就两步:①installDecor() 初始化DecorView ②mLayoutInflater.inflate(layoutResID, mContentParent)(加载XML布局)

installDecor()
  1. 初始化DecorView,这里的mContentParent其实就是DecorView

  2. 将DecorView传入generateLayout()生成布局

image.png

1.1 generateDecor里就是直接return了new DecorView

  1. onResourcesLoaded加载资源

3.1 onResourcesLoaded()方法里,其实调用了inflater.inflate()来生成View,然后addView添加到父布局下面

mLayoutInflater.inflate() - LayoutInflater.java
  1. LayoutInflater.inflate()就是用来加载xml的

  1. View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot)三个参数分别是 XML解析器、父布局的类型、是否要添加到父布局下面(详情看第四步)

attachToRoot 用到的地方 image.png

  1. 查看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的属性都是空的

  1. 因为第三步,View创建是通过反射的,所以现在xml里自己写的属性还是没有的,所以得通过获取 LayoutParams在将属性设置给View

  1. 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
  1. 起点是ActivityThread.java handleBindApplication()方法 ,在这加载Application的

  1. 先new了一个Instrumentation(翻译仪表),这个类是用来加载Activity的

image.png

  1. 生产了makeApplication,然后调用了Application.onCreate();

makeApplication()-- LoadedApk.java

先看Application的生产过程

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。

技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;

我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

(img-gn2UrBg2-1712330092496)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值