【字节跳动大牛系列教学】Android源码剖析之Framwork层消息传递

前面讲过Wms、Ams与Activity的一系列交互,包括创建过程、消息传递、窗口展示等,紧接上篇介绍最终的实现者-窗口和View,上篇对窗口已经有了比较多的介绍,本篇我们再对View再更深一步的了解。

首先明确下View的功能,主要用来展示画布即交互的图片背景等,而且承接各种手势动作消息,以及这两者之间的一系列内容;其他的属于窗口的概念;也可以说内容展示除了窗口就是View。


消息分发指:

1、将触摸、键盘输入等消息转化成操作系统可识别的信号

2、判断按键消息直接发给当前窗口进入View,触摸消息根据坐标匹配窗口

3、最终处理消息。

界面绘制指:

1、计算视图大小执行measure方法

2、为视图分配位置执行layout方法

3、将视图绘入窗口即draw方法。而View所有的功能将围绕这两点展开。

就第一点先说说,用户消息类型指Wms将硬件物理消息转化成统一格式消息,分为三类:按键消息、触摸消息和轨迹球消息(此消息API的Demo中可见,游戏中比较常见)。而消息的组成由以下三项:Action(上和下)、KeyCode(键代码0-9a-z)、Repeat(重复次数)。

PS:由于安卓系统没有苹果系统全面,按键消息不断发出,安卓需要自己定义滑动速度和动作逻辑如消息延迟动作+延迟时间(500ms),因此安卓开发者也可以对此进行拓展。按键消息只有上和下,而触摸消息比较多样化,下面就拿它作为例子讲一讲:

Action:屏幕一般支持多点触控,比按键多出POINTER_DOWN2、POINTER_UP2等

EventTime和DownTime:消息发生时间和按下时间,用以区别按键和滑动事件

Pressure:力度大小,可大于1

Size:电容触摸的面积大小,0-1之间

getX(size)和getY(size):触摸点的x和y坐标

按键消息派发过程:比较简单,不再用图形展示,直接写步骤;先说长按事件

1、生理长按(native C++中定义,区别于长按延迟500ms)时间,首次按下不松手,会启动二次长按

2、按下后,如View类无处理,且来自于DPAD_CENTER,则View启动异步消息加调onLongClick事件

再说点击事件

1、底层得到按键消息后,回调ViewRoot的InputHandler中的handleKey函数,再调用dipatchKey函数,发送DISPATCH_KEY消息,让deliverKeyEvent方法处理:

一、执行mView.dispatchKeyEventPreIme():在输入法之前处理,这样重写此方法返回true,可以拦截Ime

二、派发消息到输入法中

三、执行deliverKeyEventToViewHierarchy,传递给真正要处理的视图;此时还要做几件事:

判断消息是否导致离开触摸模式、将消息给到根View如应用窗口的DecorView或非应用窗口的ViewGroup(依次处理音量键、系统快捷键、Activity、PhoneWindow、最后View)、未处理消息是否会引起焦点切换、找到获得焦点的view

PS:上面讲到派发事件到根视图,其中有项是到Activity,先执行dispatchKeyEvent**(回调onUserInteraction、Window对象的superDispatchKey、KeyEvent.diapatch如无调用否则停止-调用state.startTracking对消息跟踪和回调receiver.onKeyLongPress完成长按处理代码,继承后不执行下步,再执行onKeyDownView中-按键消息是DPAD_CENTER或KEYCODE_CENTER代表确定,判断是否可按,是否可长按,longClick和showContextMenu发生在这里;Activity中-处理Back键,判断mDefaultKeyMode如DEFAULT_KEYS_DISABLE什么也不干、DIALER拨号程序、SHORTCUT快捷键、SEARCH_LOCAL/GLOBAL本地或全局搜索处理相关逻辑,键转字符keyMode,启动相关Activity;PhoneWindow-记得前面讲过,再讲一遍,依次判断执行音量键、播放器键(一般没有)、相机键、菜单键、拨号键、搜索键)**和onKeyUp(同前者)

按键与触摸最大区别在于:

前者需要先经过Wms(如上面括号里执行的),后者直接进入View;

其次前者是父视图(super.dispatchKeyEvent)先处理消息,然后才是子视图,后者恰恰相反;

前者有系统键,后者要确实处理View,而查收的方法。

触摸消息发生时,区分应用窗口和非应用窗口,

前者对应PhoneWindow的DecorView类型,如果存在Callback对象,调用dispathTouchEvent,则执行Activity的,然后再执行Window的,最后调用mDecorView.onTouchEvent(当然之前要计算是否拦截),不存在则直接调用ViewGroup的

后者对应ViewGroup类型,如果onInterceptTouchEvent未拦截(默认不拦截),则直接分发给子View。

PS:如利用onTouchEvent却没有调用父类此方法,则触摸、点击和长按事件均不会触发,过程tap->press->longpress。

View的绘制上面已讲,那么诱因是什么?1、内部状态发生变化调用rqeustFocus   2、添加或删除子View调用requestLayout   3、大小发生变化调用invalidate,后两者可见性发生改变时也会涉及到。

列举几个比较常见的方法作为结束:

refreshDrawableList:为视图赋予不同的Drawable对象

onFocuseChanged:处理焦点变化的逻辑,输入法与View间通过window来交互

setVisibility:设置可见性,可见到不可见不会调用requestLayout,而到GONE则需要调用

invalidate:对View树重绘,一般requestLayout之后均会调用,顺序先根后子

requestFocus:使某视图获得焦点,直接调用或方向键移动

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

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

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

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

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

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

最后

答应大伙的备战金三银四,大厂面试真题来啦!

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析*

[外链图片转存中…(img-RsbwRLUw-1711972508452)]

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值