`

Android核心分析(15)--------Android输入系统之输入路径详解

阅读更多

原文地址:http://blog.csdn.net/maxleng/article/details/5561401

 

Android用户事件输入路径

 

1 输入路径的一般原理

      按键,鼠标消息从收集到最终将发送到焦点窗口,要经历怎样的路径,是Android GWES设计方案中需要详细考虑的问题。按键,鼠标等用户消息消息的处理可分为不同的情况进行判定:

(1)用户输入根据系统状况是否应该派送。如在ScreenOff的情况下,在按键属于特殊按键的情况下等

(2)是否有拦截Listener

(3)对按键事件来讲,是否存在输入法

(4)是否是焦点终点

(5)是否为焦点切换按相关键

这些情况都是设计输入路径需要考虑的基本条件。

1.1一般的输入路径设计

该输入路径实际上是指的按键消息(MSG_KEYDOWN,MSG_KEYUP, MSG_LongPress)的输入路径,即从活动主窗口到焦点窗口所经历的路程。

inputNormal

将信息输入路径分为两步:

Step 1)窗口管理器将信息发送到活动窗口

Step 2)活动窗口通过缺省处理函数将该消息一层层的传递到焦点。

这样应用程序可以在活动View的处理函数中来预先处理用户输入信息,从而增强应用对用户信息的控制力。

inputxxx1

传递路径是通过View的缺省处理函数Onxxx来完成。通过ActiveView ->focus->focus->focus的链条关系,一级一级的将按键消息MSG_KEYDOWN,MSG_KEYUP, MSG_CHAR等传递到focus窗口。

inputxxx2

此时用户按键输入先发送到输入法窗口,经过输入法管理器处理,过滤后将输入法产生的结果放置到焦点View。

1.3输入系统整体流程

下面示意图是Android输入系统的数据流途径,通过WM的输入系统线程收集消息,分发到Focus Activity消息队列,然后通过消息系统派发。

InputSystemPATH

 

 

2 Android输入路径详细描述

 

  2.1 第一步:用户数据收集及其初步判定

     KeyInputQ在WindowMangerService中建立一个独立的线程InputDeviceReader,使用Native函数readEvent来读取Linux Driver的数据构建RawEvent,放入到KeyQ消息队列中。

inputDeviceReader

preProcessEvent()@KeyInptQ@KeyInputQueue.java 这个是在输入系统中的第一个拦截函数原型。KeyQ重载了preProcessEvent()@WindowManagerService.java。在 该成员函数中进行如下动作:

(1) 根据PowerManager获取的Screen on,Screen off状态来判定用户输入的是否WakeUPScreen。

(2) 如果按键式应用程序切换按键,则切换应用程序。

(3) 根据WindowManagerPolicy觉得该用户输入是否投递。

2.2 第二步 消息分发第一层面

InputDispatcherThread从KeyQ中读取Events,找到Window Manager中的Focus Window,通过Focus Window记录的mClient接口,将Events专递到Client端。

inputDispatcherThread

如何将KeyEvent对象传到Client端:

在前面的章节(窗口管理ViewRoot,Window Manager Proxy)我们已经知道: 在 客户端建立Window Manager Proxy后,添加窗口到Window Manager service时,带了一个跟客户ViewRoot相关的IWindow接口实例过去,记录在WindowState中的mClient成员变量中。通过 IWindow这个AIDL接口实例,Service可以访问客户端的信息,IWindow是Service连接View桥梁。

IWindow

看看在Client ViewRootKeyEvent的分发过程

IWindow:dispatchKey(event)

dispatchKey(event)@W@ViewRoot@ViewRoot.java

       ViewRoot.dispatchKey(event)@ViewRoot.java

                     message>

                     sendMessageAtTime(msg)@Handler@Handler.java

至此我们通过前面的Looper,Handler详解章节的分析结论,我们可以知道Key Message已经放入到应用程序的消息队列。

2.3第三步:应用消息队列分发

   消息的分发,在Looper,Handler详解章节我们分析了Looper.loop()在最后后面调用了handleMesage.

          …

           ActivityThread.main()

                Looper.loop()

                  ViewRoot$RootHandler().dispatch()

                      handleMessage

                          ....

      注意到在分发的调用msg.target.dispatch(),而这个target在第二层将消息sendMessageAtTime到消息队列时填入了mag.target=this即为msg.target=ViewRoot实例。 所有此时handleMessage就是ViewRoot重载的handleMessage函数。

handlerMessage@ViewRoot@ViewRoot.java

       deliverkeyEvent

            如果输入法存在,dispatchKey到输入法服务。

            否则deliverKeyEventToViewHierarchy@ViewRoot.java

     在这里需要强调的是,输入法的KeyEvent的拦截并没有放入到Window Manager Service中,而是放入到了客户端的RootView中来处理。

2.4第四步:向焦点进发,完成焦点路径的遍历。

focuspath1

分发函数调用栈

deliverKeyEventToViewHierarchy@ViewRoot.java

mView.dispatchKeyEvent: mView是与ViewRoot相对应的Top-Level View.如果mView是一个ViewGroup则分发消息到他的mFocus。

mView.dispatchKeyEvent @ViewGroup  (ViewRoot@root)

               Event.dispatch

                        mFocus.dispatchKeyEevnet

    如果此时的mFocu还是一个ViewGroup,这回将事件专递到下一层的焦点,直到mFocus为一个View。通过这轮调用,就遍历了焦点Path,至此,用户事件传递完成一个段落。

2.5第五步 缺省处理

如果事件在上述Focus View没有处理掉,并且为方向键之类的焦点转换相关按键,则转移焦点到下一个View。

 

分享到:
评论

相关推荐

    [经典文档]Android核心分析

    核心分析之十五 ----- Android 输入系统之输入路径详解 核心分析之十六 ----- Android 电话系统-概述篇 核心分析之十七 ----- Android 电话系统-RILD 核心分析之十八 ----- Android 电话系统之RIL-JAVA 核心分析之十...

    android 核心分析

    Android 核心分析(15)--------Android 输入系统之输入路径详解.............................. 59 Android 核心分析(16)-----Android 电话系统-概述篇...............................................66 Android ...

    Android核心分析-050417421

    5.输入系统:Android输入系统之输入路径详解。 6.电话系统:Android电话系统概述篇、rilD、RIL-Java、GSMCallTacker。 7.应用程序框架:Android应用程序框架之无边界设计意图、Android应用框架之Android...

    Android核心设计思想分析

    Android核心分析(15)--------Android输入系统之输入路径详解..............................59 Android核心分析(16)-----Android电话系统-概述篇...............................................66 Android核心...

    android核心分析pdf

    **Android核心分析(15):** 详细解析了输入事件在系统中的传递路径,包括从硬件设备接收事件到最终触发UI响应的整个过程。 #### 十二、电话系统 **Android核心分析(16):** 提供了对Android电话系统的概述,...

    Android核心分析15

    [转]Android核心分析 技术专题之十五--Android输入系统之输入路径详解

    android-studio-ide-192.6392135-windows.rar

    安装过程中,系统会引导用户选择安装路径、设置启动快捷方式等选项,安装完成后,开发者便可以开始使用这个强大的开发工具进行Android应用开发。 总的来说,Android Studio为Android开发者提供了一个全面、高效且...

    android-sdk-macosx.zip

    《Android SDK for macOS详解》 Android SDK(Software Development Kit)是开发者进行Android应用程序开发不可或缺的工具集,它包含了编译、调试、模拟等所需的各种组件和库。在本篇文章中,我们将深入探讨...

    Android SDK (SDK Platforms)-android-34-ext8.zip

    在Android SDK中,SDK Platforms是核心部分,提供了开发环境所需的平台框架、系统库和API文档。 **Android SDK详解** Android SDK(Software Development Kit)是Google提供的一套工具,用于帮助开发者创建、调试...

    Android-Universal-Image-Loader使用详解

    Android-Universal-Image-Loader(UIL)是一款广泛应用于Android开发中的图片加载库,它提供了强大的功能,包括异步加载、缓存策略、错误处理以及多种显示选项,使得开发者能够更高效、灵活地处理应用程序中的图像...

    android-studio3.6-ide-192.6200805-windows安装包

    《Android Studio 3.6 安装指南及详解》 Android Studio是Google为开发者提供的一款强大的集成开发环境(IDE),专用于构建Android应用程序。本文将详细介绍Android Studio 3.6的安装过程及其重要特性,帮助开发者...

    android-studio-2021.3.1.17-windows.exe

    《Android Studio 2021.3.1.17 Windows版详解》 Android Studio作为谷歌官方推荐的Android应用程序开发集成开发环境(IDE),一直以来都是开发者的重要工具。本篇文章将详细解析“android-studio-2021.3.1.17-...

    Android-SerialPort-API-master

    《Android串口通信API详解——基于谷歌开源项目Android-SerialPort-API》 在移动设备开发领域,Android系统因其开源、可定制性强等特点被广泛应用。在某些特定场景下,如物联网设备控制、工业自动化等,串口通信是...

    android-serialport-api-master

    《Android串口通信API详解——基于android-serialport-api源码》 在Android系统中,进行硬件设备交互,如读写传感器数据、控制外部设备等,串口通信扮演着重要角色。本文将深入探讨"android-serialport-api"库,它...

    Android Studio SDK Build-tools, revision 19.1.0

    **Android Studio SDK Build-tools 19.1.0详解** Android Studio SDK Build-tools是Android开发者必备的工具集,主要用于构建Android应用程序。版本19.1.0是该工具集的一个特定迭代,它包含了构建Android应用时所需...

    android-sdk_r24.4.1-windows.7z

    在系统环境变量中添加`ANDROID_HOME`,将其值设置为SDK的安装路径,例如`C:\Android\sdk`。同时,添加`PATH`环境变量,包含`%ANDROID_HOME%\tools`和`%ANDROID_HOME%\platform-tools`,这样你就可以在命令行中直接...

    android-12.0.0-r34的android.ipr和android.iml

    这个文件包含了模块的依赖、源代码路径、输出路径、模块类型(例如,Android Application或Android Library)以及编译设置等。在`android-12.0.0-r34`中,`android.iml`可能包含了项目的主要应用模块,详细列出了...

    Android核心分析.doc

    15. 输入路径详解:详细解析了输入事件从硬件到软件的传递路径,以及如何通过InputDispatcher进行分发。 16. 电话系统概述:介绍了Android的电话功能,包括拨号、接听、通话管理和SIM卡处理。 以上是《Android核心...

    Android核心分析系列教程

    #### 十五、Android输入系统之输入路径详解 这部分内容深入分析了从物理输入设备接收信号到最终触发应用程序响应的过程。这包括了事件分发机制、输入过滤器等细节。 #### 十六、Android电话系统-概述篇 这部分...

    android----TxtReader

    《Android平台上的TXT阅读器开发详解》 在移动设备上,阅读电子书籍已经成为日常生活中不可或缺的一部分,而TXT格式因其简洁、通用,成为许多用户首选的文本格式。本项目"android----TxtReader"就是一个专为Android...

Global site tag (gtag.js) - Google Analytics