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不響應
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态