2024最全Android三方框架源码面试深度解析(GitHub标星4-6K+,值得收藏

1、ViewGroup 的事件分发

  • 首先判断自身是否需要,需要则进行拦截,并调用自身的 onTouchEvent 方法进行使用并决定是否消费,子 View 对事件无感。
  • 自己不需要则不进行拦截,事件分发给子 View(事件会分发给手指触摸区域的子 View,有重叠时传递给最上层 View)
  • 子 View 不消费时,事件会回传,调用自身的 onTouchEvent 方法进行使用并决定是否消费;子 View 消费时事件不回传

伪代码:

public boolean dispatchTouchEvent(MotionEvent event) {
// 默认状态为未消费过
boolean result = false;
// 如果没有拦截
if (!onInterceptTouchEvent(event)) {
// 则交给子 view
result = child.dispatchTouchEvent(event);
}
// 如果事件没有被子 View 消费
if (!result) {
// 则询问自身 onTouchEvent()
result = onTouchEvent(event);
}
// 返回事件消费状态
return result;
}

2、View 的事件分发

dispatchTouchEvent 方法对 View 的监听器和方法进行分发,顺序如下:

onTouchListener – > onTouchEvent – > onLongClickListener – > onClickListener

Android 按键事件分发机制源码分析

Android 按键事件分发机制源码分析完整版地址

分发流程:

1、Activity 的分发

  • Activity 接收到事件,为 Menu 键直接消费掉。否则分发给 PhoneWindow,PhoneWindow 直接传递给它的 DecorView
  • DecorView 对 Back 键进行判断是否消费,不消费则分发给 ViewGroup
  • ViewGroup 不消费时,事件分发给 KeyEvent

2、ViewGroup 的分发

  • ViewGroup 有焦点且大小确定时,首先自己处理
  • ViewGroup 的子 View 有焦点且大小确定时,分发给子 View
  • 层层向下分发,直到最底层 View

3、View 的分发

View 首先将事件传递给 onKeyListner 监听器,不消费时传递给 KeyEvent

4、KeyEvent 的分发

KeyEvent 会根据类型来分别决定回调 Activity 或 View 的 onKeyDown、onKeyUp、onKeyLongPress 方法

5、事件回传

当 Activity、View 的 onKeyDown、onKeyUp 也没有消费事件时,事件会进行回传

OkHttp 源码分析

示例:

mOkHttpClient.newCall(request).enqueue(callback);

概述版

  • OkHttp 将请求信息封装在 Request 对象中,并创建一个 Call 对象
  • 调用 Call 对象的方法发起网络请求,采用责任链模式,将请求信息依次传递给每个拦截器,最终发起网络请求并返回结果

分析版

1、OkHttpClient 的构建采用了 Builder 模式,Builder 模式易写易读且线程安全,适用于类的构造器有多个参数的情况

2、OkHttpClient 实现了 Call.Factory 接口(newCall 方法),通过 newCall 方法可以得到一个 RealCall 对象,可以操作 RealCall 对象执行请求、取消等一系列操作

3、RealCall 执行 execute 方法时,首先会在 client 的同步执行任务队列中记录当前 Call,然后在当前线程通过拦截器链条获取执行结果,最后对列中移除 Call

4、拦截器链条采用责任链模式,会依次执行每一个拦截器的 proceed 方法,直到最终的 CallServerInterceptor 完成网络请求

5、RealCall 的 enqueue 方法会直接将 Call 添加到 dispatcher 的异步执行队列,执行网络请求时也是通过拦截器链条完成

6、请求相关的所有信息封装在 Request 对象中,对于 Post 请求体 RequestBody 可以由 Byte 数组、ByteString、File、String 生成

OkHttp 源码分析完整版地址

Retrofit 源码分析

示例:

mRetrofit.create(RequestService.class).doGet(“params”).enqueue(callback);

概述版

  • Retrofit 接口层实际是对 OkHttp 中 Request 的封装,采用注解的形式来描述网络请求参数
  • 采用动态代理模式创建请求接口对象,请求执行调用接口方法时,Retrofit 会根据注解创建相应的Call对象,接下来使用OkHttp发起请求

分析版

1、首先需要使用注解的形式定义请求接口

2、然后通过建造者模式构造出 Retrofit 对象,Retrofit 对象的 create 方法采用动态代理模式,创建出请求接口的实例

3、发起请求时调用请求接口实例的相应方法,被调用处理器(InvocationHandler)拦截,最终返回一个 OkHttpCall 对象,OkHttpCall 有实现 Call 接口

4、接下来就是 OkHttp 的工作,调用 OkHttpCall 的 enqueue 或 execute 方法发起网络请求

Retrofit 源码分析完整版地址

ButterKnife 源码分析

概述版

  • 写代码时对目标元素进行注解,编译时注解处理器会扫描注解,并通过 JavaPoet 自动生成 Java 文件
  • 调用 ButterKnife.bind()方法时,通过反射拿到编译时生成的类,调用其构造方法完成目标类和绑定类的绑定

分析版

1、注解处理器 ButterKnifeProcessor 在编译时会扫描和处理所有注解,通过 JavaPoet 自动生成 .java 文件

2、调用 ButterKnife 的 bind 方法,通过反射拿到目标类类名,后面拼接_ViewBinding找到刚刚自动生成的 Java 类,并根据参数找到相匹配的构造器

3、调用 ViewBinding 类构造器的构造方法,将 ViewBinding 类和 目标类进行绑定

4、ViewBinding 类的构造方法中会对目标类的成员变量进行初始化及点击事件配置

ButterKnife 源码分析完整版地址

学习福利

【Android 详细知识点思维脑图(技能树)】

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

详细整理在石墨文档可以见;

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

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

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

【附】相关架构及资料

往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。**

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-5zuHT78f-1712761599026)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值