首页 > 编程知识 正文

android 线程安全(android消息机制面试)

时间:2023-05-03 07:35:24 阅读:91088 作者:1801

可以分为

Android事件分发机制(应用层)

事件、event、各种类型。 根据事件的流程,分为输入事件和输出事件。 根据事件的类型,可以分为触摸事件、按键触摸事件、鼠标事件等。 在发展层面,涉及APP应用层、体系层和驱动层。

APP层聚焦于移动类(触摸屏) APP开发是触摸事件,聚焦于电视类)遥控器) APP开发是关键事件,都是APP应用层开发。 系统层涉及添加按钮、按钮映射、拦截案件、定制行为等。 驱动器层,包括设备的创建和解码等。

Android事件分发逻辑非常复杂,涉及到了Native层的服务和Java层的服务和APP层的进程。 本文找出中间的切入点,有服务端的逻辑,主要分享APP级关键事件的分发机制。

在上图中,没有找到绘制代码调用链的易用工具。 这张图不是代码调用链。 此图显示了关键事件在APP应用层通过的每个阶段。 六个环节。

在第一个工作站上,关键事件首先到达前面活动的dispatchKeyEvent ()方法。

在第二个工作站上,关键事件到达前面活动的onUserInteraction ()方法。

到达了第三站,关键事件焦点视图View的关键事件侦听器。

在第四个工作站上,关键事件到达焦点视图View的onKeyDown ()方法。

在第五个工作站上,关键事件到达前端活动的onKeyDown (方法。

在第六站,关键事件到达顶窗口的onKeyDown ()方法。

这是APP中的关键事件流,如果在中间的任意阶段消耗了“返回真”(return true ),过程将终止。 当然,从整个安卓系统来看,这是按键过程的中间阶段,在这之前和之后都有其他部分。

事件的发送以窗口为单位,InputServer负责将事件发送到一个或多个窗口,window负责将事件发送到特定的视图。 一个活动或诊断程序对应一个窗口。

WindowManagerService在收到按键事件时,会调用ViewRootImpl的dispatchInputEvent ()方法

在本例中,将消息MSG_DISPATCH_INPUT_EVENT发送到查看程序。

由于processImmediately为true,因此将继续调用doProcessInputEvents ()方法

这里涉及一个叫做InputStage的知识点。

9a95221215beee?from=pc">

mView是ViewRootImpl的setView()方法进行赋值,mView是DecorView的一个实例。这里是调用DecorView的dispatchKeyEvent()方法传递KeyEvent过去。从这里开始正式进入应用层按键事件处理流程。

开发者编码Activity的时候会调用setContentView()方法,传递自己的布局过去,这个方法会调用到PhoneWindow的setContentView()方法。PhoneWindow的setContentView()方法会实例化DecorView,传递自己过去,DecorView成员变量mWindow就是PhoneWindow的实例。

mWindow的getCallback()方法返回的是Activity的实例。Activity有实现Window.Callback接口的dispatchKeyEvent()方法

这里是按键事件被分发到应用程序之后,开发者最早可以进行控制的地方。开发者可以在自己的Activity里面重写onUserInteraction()或者dispatchKeyEvent()来进行最高优先级的处理。如果按键事件没有被消费,会进入下面的环节。

分发事件给当前获得焦点的视图。

这里根据优先级分两步。首先分发给View的按键监听器去处理。如果没有被消费,会进行第二步分发。调用KeyEvent的dispatch()方法,实际就是传自己过去,dispatch()会调用传过来的对象的onKeyDown()方法。

View的onKeyDown()方法多在自定义View的时候使用,按键监听器是给直接使用View的人去做按键逻辑定制化。

到这里就到了调用层级的最后,然后开始返回。会返回Activity的dispatchKeyEvent()方法的最后:

这里有些熟悉,前面已经分析过源码,这里其实就是调用Activity的onKeyDown()方法

到这里Activity的逻辑也执行完了,会继续返回,回到DecorView的dispatchKeyEvent()方法

这里是调用PhoneWindow的onKeyDown()方法

至此,应用层面的按键事件流程结束。

总结一下:

按键事件处理过程中,返回true,表示消费了事件,不再往下面分发。

视图的事件监听器优先级比默认事件处理逻辑onKeyDown()高。

按键事件最先分发到Activity中处理。

按键事件最后会分发都窗口,调用窗口的默认处理逻辑onKeyDown()。

Activity的按键事件默认处理逻辑优先级高于窗口默认处理逻辑onKeyDown()。

触摸事件的流程更短,而且网上关于触摸事件分享的文章非常多,这里就不介绍了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。