`
meohao
  • 浏览: 97717 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

写在20120510:事件流程传递机制

 
阅读更多
学习:博客《老罗的Android之旅》中的事件传递,了解详情可以去他的博客看看,很多经典详细的源码分析!值得一看。
   在Android系统中,键盘按键事件是由WindowManagerService服务来管理的,然后再以消息的形式来分发给应用程序处理,不过和普通消息不一样,它是由硬件中断触发的; 在系统启动的时候,SystemServer会启动窗口管理服务WindowManagerService,WindowManagerService在启动的时候就会通过系统输入管理器InputManager来总负责监控键盘消息。这些键盘消息一般都是分发给当前激活的Activity窗口来处理的,因此,当前激活的Activity窗口在创建的时候,会到WindowManagerService中去注册一个接收键盘消息的通道,表明它要处理键盘消息,而当InputManager监控到有键盘消息时,就会分给给它处理。当当前激活的Activity窗口不再处于激活状态时,它也会到WindowManagerService中去反注册之前的键盘消息接收通道,这样,InputManager就不会再把键盘消息分发给它来处理。分别是InputManager的启动过程、应用程序注册键盘消息接收通道的过程、InputManager分发键盘消息给应用程序的过程以及应用程序注销键盘消息接收通道的过程。

1.InputManager的启动过程

SystemServer -> windowManagerService<main> ->InputManager<Callbacks>(C++层,通过创建EventHub创建)-> InputReader(读取按键事件)&& InputDispatcher(分发消息)

A. 有系统服务进程启动窗口管理服务WindowManagerService,在Java层中的WindowManagerService中创建了一个InputManager对象,由它来负责管理Android应用程序框架层的键盘消息处理;
B. 在C++层也相应地创建一个InputManager本地对象来负责监控键盘事件;
C. 在C++层中的InputManager对象中,分别创建了一个InputReader对象和一个InputDispatcher对象,前者负责读取系统中的键盘消息,后者负责把键盘消息分发出去;
D. InputReader对象和一个InputDispatcher对象分别是通过InputReaderThread线程实例和InputDispatcherThread线程实例来实键盘消息的读取和分发的。
   EventHub作为参数来创建InputManager对象,EventHub类是真正执行监控键盘事件操作的地方,通过mEventHub来负责键盘消息的读取工作,如果当前有键盘事件发生或者有键盘事件等待处理,通过mEventHub的getEvent函数就可以得到这个事件,然后交给process函数进行处理,这个函数主要就是唤醒前面的InputDispatcherThread线程,通知它有新的键盘事件发生了,它需要进行一次键盘消息的分发操作了;如果没有键盘事件发生或者没有键盘事件等待处理,那么调用mEventHub的getEvent函数时就会进入等待状态。——EventHub.getEvent()是判断事件传递问题上层和底层驱动问题的分界点,如果有事件上报,就肯定不是底层驱动的问题了。

2.应用程序注册键盘消息接收通道的过程
    当前被激活的Activity/ViewGroup窗口来注册消息接收通道,每一个Activity,系统都会为其创建一个ViewRoot,而在ViewRoot.setView()的时候就会去注册键盘消息接收通道。
A. 即将会被激活的Activity窗口,会通知InputManager,它是当前激活的窗口,因此,一旦发生键盘事件的时候,InputManager就把这个键盘事件抛给这个Activity处理;
B. 应用程序会为这个Activity窗口和InputManager之间创建一个键盘消息接收通道,这个通道的一端由一个Server端的InputChannel构成,另一端由Client端的InputChannel构成,Server端的InputChannel注册在由InputManager所管理的InputDispatcher中,而Client端的InputChannel注册在由应用程序主线程的消息循环对象Looper中;
C. 注册在InputDispatcher中的InputChannel由一个反向管道的读端和一个前向管道的写端组成,而注册在应用程序主线程的消息循环对象Looper中的InputChannel由这个前向管道的读端和反向管道的写端组成,这种交叉结构使得当有键盘事件发生时,InputDispatcher可以把这个事件通知给应用程序

3.InputManager分发键盘消息给应用程序的过程
A. 假设开始没有键盘事件,此时InputReader处于休眠状态,一旦有键盘事件发生,InputManager中的InputReader被唤醒,此前InputReader睡眠在/dev/input/event0这个设备文件上;
B. InputReader被唤醒后,它接着唤醒InputManager中的InputDispatcher,此前InputDispatcher睡眠在InputManager所运行的线程中的Looper对象里面的管道的读端上;
C. InputDispatcher被唤醒后,它接着唤醒应用程序的主线程来处理这个键盘事件,此前应用程序的主线程睡眠在Client端InputChannel中的前向管道的读端上;
D. 应用程序处理处理键盘事件之后,它接着唤醒InputDispatcher来执行善后工作,此前InputDispatcher睡眠在Server端InputChannel的反向管道的读端上,注意这里与第二个线索处的区别。

4.Activity对事件的处理
   处理顺序:ViewRoot->(Activity && (ViewGroup->View)) ->->PhoneWindow(不处理onKey()但处理onKeyDown和onKeyUp())

5.应用程序注销键盘消息接收通道的过程
   当Activity窗口创建时,它会向InputManager注册键盘消息接收通道,而当Activity窗口销毁时,它就会向InputManager注销前面注册的键盘消息接收通道了。当我们按下键盘上的Back键时,当前激活的Activity窗口就会被失去焦点,但是这时候它还没有被销毁,它的状态被设置为Stopped;当新的Activity窗口即将要显示时,它会通知WindowManagerService,这时候WindowManagerService就会处理当前处理Stopped状态的Activity窗口了,要执行的操作就是销毁它们了,在销毁的时候,就会注销它们之前所注册的键盘消息接收通道。

分享到:
评论

相关推荐

    Android事件传递机制

    在Android系统中,事件传递机制是用户界面交互的核心部分,主要处理用户与屏幕的各种触摸操作。这个机制确保了用户点击屏幕时,相应的视图能够正确地接收到并响应这些事件。我们今天将深入探讨Android的触摸事件...

    事件传递机制和原理

    本篇文章基于一个关于“事件传递机制和原理”的流程图进行深入解析,旨在帮助开发者更好地掌握事件传递的核心概念与流程。 #### 一、事件传递机制概述 Android中的事件传递主要包括三个关键步骤:分发(dispatch)、...

    极致:android触摸事件传递机制

    android触摸事件传递机制图文详解,自认为最简略最完善的流程图!

    android Touch事件传递机制

    在Android系统中,触摸事件(Touch Events)是用户与设备交互的主要方式,它涉及到了复杂的事件传递机制。本文将深入探讨Android的触摸事件处理流程,包括事件的产生、分发以及处理过程,以实例的形式帮助开发者理解...

    View事件传递机制Demo源码

    在Android开发中,View事件传递机制是理解和优化用户交互界面不可或缺的部分。本Demo源码着重展示了这一机制,旨在帮助开发者深入理解并应用到实际项目中。以下是对这一主题的详细阐述。 首先,我们要知道Android中...

    Android事件处理机制ViewGroup的事件传递

    在开发中,理解事件传递机制对于创建自定义布局和交互式组件至关重要。例如,可以利用事件拦截来实现列表项的拖放功能,或者在嵌套的滚动视图中控制滚动方向。 总之,`ViewGroup`的事件传递是Android UI编程中的...

    android 事件传递机制dome

    1. **事件分发流程**:事件首先被发送到最上层的View,即Activity或Window,然后逐级向下传递到ViewGroup和子View。这个过程由`dispatchTouchEvent()`方法完成,称为“事件分发”。 2. **事件处理**:每个View都有...

    事件传递机制实例代码

    在Android开发中,事件传递机制是一个至关重要的概念,它决定了用户与界面元素交互时,事件如何在各个View之间进行分发。本实例代码主要展示了如何重写几个关键的方法来理解和控制事件的处理流程。 首先,我们需要...

    Android onTouch事件传递机制

    本篇文章将深入探讨Android的`onTouch`事件传递机制,帮助开发者更好地理解和运用这一功能。 首先,Android的触摸事件主要由三个基本事件构成:`ACTION_DOWN`、`ACTION_UP`和`ACTION_MOVE`。`ACTION_DOWN`表示手指...

    Android Touch事件传递机制解析

    本文将深入解析Android的Touch事件传递机制,帮助开发者理解这一核心概念。 首先,我们了解下Android中的触摸事件类型。主要有三种:ACTION_DOWN、ACTION_UP和ACTION_MOVE。ACTION_DOWN表示手指首次接触屏幕,...

    Android事件传递机制_郑平201609011

    在这个机制中,我们主要关注三个关键概念:事件的分发(dispatchTouchEvent)、事件的拦截(onInterceptTouchEvent)以及事件的响应(onTouchEvent)。 首先,我们要明确事件总是先到达父控件。不论是Down事件...

    android事件传递机制demo代码

    本示例代码“android事件传递机制demo代码”着重于ViewGroup的事件处理流程,通过`testTouchEvent`这个文件,我们可以深入理解Android中的触摸事件(TouchEvent)如何在组件层次间传递。 Android事件传递主要分为三...

    手写Android事件分发机制

    在Android开发中,事件分发机制是至关重要的一个部分,它决定了用户与界面交互时,事件如何在View、 ViewGroup及Activity之间传递。本教程将深入探讨如何手写Android事件分发机制,通过自定义代码来理解和模拟原生...

    维修信息流程传递图(流程图)

    在这个案例中,“维修信息流程传递图”专注于展示设备维修过程中信息的流动路径和处理方式。以下是这个主题的详细解释: 1. **流程图的基本概念**:流程图是由图形符号组成的图表,包括开始/结束框、处理过程框、...

    android事件分发机制

    本文将深入探讨Android事件分发机制,特别是触摸事件(Touch事件)的处理流程。 首先,我们要理解Android事件的产生过程。当用户与设备交互,如点击屏幕或按下物理按键时,硬件会生成相应的事件,这些事件由Android...

    android事件分发流程

    在Android系统中,事件分发流程是用户与应用程序交互的核心机制。它决定了用户在屏幕上点击、滑动等操作如何被各个UI元素正确处理。本文将深入解析Android事件分发的详细过程,帮助开发者理解这一关键机制。 事件...

    Android触摸事件传递机制

    Android触摸事件传递机制图解,这个流程详细的受不鸟!

    Android点击事件传递分析Demo

    本文将通过"Android点击事件传递分析Demo"深入探讨这一主题,结合示例代码和图表,帮助开发者理解Android中点击事件的传递机制。 首先,Android中的点击事件主要由四个基本的触摸事件构成:ACTION_DOWN(手指触摸...

    Android事件分发机制总结Demo

    - ACTION_DOWN:事件首先传递到最顶层的View,即DecorView,然后传递到根ViewGroup。 - 如果ViewGroup没有拦截事件(onInterceptTouchEvent()返回false),事件会进入子View的onTouchEvent()。 - 如果子View处理...

Global site tag (gtag.js) - Google Analytics