input子系統,Android4.2 Input子系統

 2023-11-30 阅读 29 评论 0

摘要:一、Android的Input子系統啟動過程 1.init進程通過Zygote啟動SystemServer input子系統,2.SystemServer通過WM啟動InputManager的兩個線程 二、事件分發整體說明 android inputtype屬性。1.InputReaderThread線程調用InputDispatcher分發給InputDispatcherThread線程消息隊列
一、Android的Input子系統啟動過程

1.init進程通過Zygote啟動SystemServer


input子系統,2.SystemServer通過WM啟動InputManager的兩個線程


二、事件分發整體說明

android inputtype屬性。1.InputReaderThread線程調用InputDispatcher分發給InputDispatcherThread線程消息隊列mInboundQueue。

2.InputDispatcherThread線程從消息隊列mInboundQueue中取出事件分發給當前激活窗口對應C++層消息隊列outboundQueue,InputDispatcherThread從當前激活窗口對應C++層的消息隊列outboundQueue中取出事件并拷貝至共享內存mSharedMessage。

3.ViewRoot注冊進NativeInputQueue的回調函數handleReceiveCallback從共享內存mSharedMessage中取出事件并調用ViewRoot的handleKey/Motion()函數分發進ViewRoot的Java層消息隊列(見:《Android系統學習》第十章:Android消息處理、消息循環和消息隊列)、經過消息循環和處理后分發給mView(PhoneWindow)、間接分發給App的Activity(見《Android系統學習》第十一章:Android應用程序Activity組件分析)。

void input,注意:App中有類繼承了Activity類并重新實現了響應函數。

以上1、2中,由于C++層Looper本身就有睡眠/喚醒管道機制、所以是異步處理機制!

以上3中、由于使用了JAVA層looper、handle和messagequeue,所以、也都是異步處理機制!

Android 4,4.補充

對于上述步驟2和3的說明:Android4.1之后已經不用共享內存了,換之是socket傳輸:

2中:InputDispatcherThread從當前激活窗口的消息隊列outboundQueue中取出事件通過C++層InputChannel的socket發送;

3中:ViewRoot注冊進NativeInputEventReceiver的回調函數handleEvent通過C++層InputChannel的socket接收,并分發給ViewRoot的JAVA層消息隊列。

并且Android4.1不像之前Android版本會去創建睡眠/喚醒管道和共享內存,換之只是一對socket描述符、完成喚醒/睡眠和數據傳輸任務。

三、相關鏈接

1.詳解事件分發

Android之Input子系統事件分發流程

Android之Input子系統與輸入法

2.游戲手柄

Linux JoyStick設備驅動

Android Input之JoyStick

3.驅動部分

《Android系統學習》第一章:Input子系統驅動部分

Linux內核學習實踐之紅外驅動分析

Linux IR遙控器不靈敏調試

Linux內核學習實踐之GPIO面板按鍵

《Linux總線、設備與驅動》USBHID設備驅動

《Linux內核編程》第七章:USB CORE與USB鍵鼠驅動

4.項目問題

Android之Input子系統配置更新導致的Activity重啟

Android之Input子系統按鍵repeat

獲取輸入設備的vid和pid

Android系統對于Touch設備配置

Android的dialog控制焦點導致其后Activity不響應

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/185700.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息