Android InputDispatcher分發輸入事件

派發循環是指 InputDispatcher 不斷地派發隊列取出事件,尋找合適的窗口并進行發送的過程,是 InputDispatcher 線程的主要工作

事件發送循環是 InputDispatcher 通過 Connection 對象將事件發送給窗口,并接受其反饋的過程

InputDispatcher —> dispatchEventLocked:dispatchEventLocked 根據 InputTarget 中的 InputChannel 找到對應的Connection


?

@frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp
//1. InputReader將事件注入派發隊列
InputDispatcher::notifyMotion mPolicy->interceptMotionBeforeQueueing(args->displayId, args->eventTime, /*byref*/ policyFlags);needWake = enqueueInboundEventLocked(std::move(newEntry));mInboundQueue.push_back(std::move(newEntry));//2.派發線程的線程循環
InputDispatcher::dispatchOnce
//3. 為事件尋找合適的窗口,窗口分為普通窗口和監聽窗口,普通通過按點和焦點查找,監聽窗口則無條件監聽所有輸入事件dispatchOnceInnerLocked(&nextWakeupTime);mPendingEvent = mInboundQueue.front();case EventEntry::Type::FOCUS:dispatchFocusLocked(currentTime, typedEntry);//dispatchFocusLocked: message=Focus entering 76ac74c com/com.MainActivity (server), reason=reason=Window became focusable. Previous reason: NOT_FOCUSABLE//dispatchFocusLocked: message=Focus leaving f81ce53 org.mozilla.firefox/org.mozilla.fenix.HomeActivity (server), reason=reason=NOT_FOCUSABLE//dispatchFocusLocked: message=Focus leaving 76ac74c com/com.MainActivity (server), reason=reason=NOT_FOCUSABLE//dispatchFocusLocked: message=Focus entering f81ce53 org.mozilla.firefox/org.mozilla.fenix.HomeActivity (server), reason=reason=Window became focusable. Previous reason: NOT_FOCUSABLE            std::shared_ptr<InputChannel> channel = getInputChannelLocked(entry->connectionToken);auto connectionIt = mConnectionsByToken.find(token);return connectionIt->second->inputChannel;InputTarget target;target.inputChannel = channel;                dispatchEventLocked(currentTime, entry, {target});case EventEntry::Type::MOTION: done = dispatchMotionLocked(currentTime, motionEntry, &dropReason, nextWakeupTime);//尋找事件接受窗口的inputTargetsstd::vector<InputTarget> inputTargets;if (isPointerEvent) { injectionResult = findTouchedWindowTargetsLocked(currentTime, *entry, inputTargets, nextWakeupTime, &conflictingPointerActions); }else { injectionResult = findFocusedWindowTargetsLocked(currentTime, *entry, inputTargets, nextWakeupTime); }                dispatchEventLocked(currentTime, entry, inputTargets);for (const InputTarget& inputTarget : inputTargets) {sp<Connection> connection = getConnectionLocked(inputTarget.inputChannel->getConnectionToken());prepareDispatchCycleLocked(currentTime, connection, eventEntry, inputTarget);enqueueDispatchEntriesLocked(currentTime, connection, eventEntry, inputTarget);//輸入事件被 InputPublisher 以 InputMessage 的形式寫入 InputChannel,然后將事件轉存到 waitQueue 中等待窗口的反饋startDispatchCycleLocked(currentTime, connection); case EventEntry::Type::FOCUS: {status = connection->inputPublisher.publishFocusEvent(dispatchEntry->seq, focusEntry.id, focusEntry.hasFocus, mInTouchMode);case EventEntry::Type::MOTION: {status = connection->inputPublisher.publishMotionEvent(motionEntry.deviceId, motionEntry.source, motionEntry.displayId,  
@frameworks/native/libs/input/InputTransport.cppmChannel->sendMessage(&msg);nWrite = ::send(getFd(), &cleanMsg, msgLength, MSG_DONTWAIT | MSG_NOSIGNAL);    //向socket寫入輸入事件                            

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37001.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37001.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot跨域請求關鍵處理技術解析

Spring Boot跨域請求關鍵處理技術解析 在Web開發中&#xff0c;跨域請求是一個常見問題&#xff0c;尤其在微服務架構和前后端分離的開發模式中更為突出。Spring Boot作為一種流行的Java Web框架&#xff0c;提供了多種解決跨域請求的方法。本文將詳細解析Spring Boot中跨域請…

在 Qt 中設置 QMainWindow 的大小

問題描述 一位 Qt 新手提問&#xff0c;是否有辦法將 QMainWindow 的大小設置為用戶桌面大小的 70%。他嘗試過使用伸縮因子&#xff0c;但未成功。QWidget::setFixedSize 可以工作&#xff0c;但只能使用像素值。 解決方案 方案一&#xff1a;使用 QDesktopWidget 在 QMain…

大模型賦能全鏈路可觀測性:運維效能的革新之旅

目錄 全鏈路可觀測工程與大模型結合---提升運維效能 可觀測性&#xff08;Observability&#xff09;在IT系統中的應用及其重要性 統一建設可觀測數據 統一建設可觀測數據的策略與流程 全鏈路的構成和監控形態 云上的全鏈路可視方案 為什么一定是Copilot 大模型的Copilo…

mov和mp4區別是什么?蘋果的原創和時代的寵兒

在數字媒體領域&#xff0c;視頻格式的選擇往往決定了觀看體驗的質量和文件的兼容性。在眾多視頻格式中&#xff0c;MOV和MP4無疑是最具代表性的兩種&#xff0c;它們分別承載著蘋果和互聯網世界的技術革新與歷史變遷。本文將帶您穿越時間的長廊&#xff0c;探索MOV與MP4的發展…

A : 平面劃分

Description 一條直線可以把平面分成兩部分&#xff0c;兩條直線分成四部分。那么 n 條直線最多可以把平面分成幾部分&#xff1f; Input 多組數據&#xff0c;每組數據一個正整數 1≤&#xfffd;≤1000。 Output Sample #0 Input Copy 3 5 Output Copy 7 16 Hin…

區間DP——AcWing 320. 能量項鏈

區間DP 定義 區間動態規劃&#xff08;Interval Dynamic Programming&#xff09;&#xff0c;簡稱區間DP&#xff0c;是動態規劃領域的一個重要分支&#xff0c;專門用于解決涉及區間問題的最優化問題。這類問題通常需要在給定的一組區間上找到最優解&#xff0c;比如求解最…

福蘭農莊攜手越南NFC巨頭朱雀橋薇妮她百香果飲料,深化品質合作

近日&#xff0c;國內知名果汁品牌福蘭農莊成功與越南NFC行業領軍者朱雀橋建立深入合作關系。為了進一步提升產品品質和市場競爭力&#xff0c;福蘭農莊派遣專業團隊前往越南&#xff0c;深入VINUT百香果飲料的生產線&#xff0c;學習其從原料采購到產品上市的嚴格操作流程。 在…

IAR 常見報錯與實用小技巧(ZigBee)

一、報錯 1.未發現選擇目標 原因&#xff1a;硬件連接存在問題 解決方案&#xff1a;將數據線重新插拔或更換接口、數據線 2. 燒錄終止 原因&#xff1a;燒錄前未點擊仿真器復位按鈕 解決方案&#xff1a; 進行燒錄前點擊仿真器復位按鈕&#xff08;下載過程中不能按&#xff…

數據結構與算法 - 圖

博客主頁&#xff1a;誓則盟約系列專欄&#xff1a;IT競賽 專欄關注博主&#xff0c;后期持續更新系列文章如果有錯誤感謝請大家批評指出&#xff0c;及時修改感謝大家點贊&#x1f44d;收藏?評論? 圖的定義和基本概念&#xff1a; 圖&#xff08;Graph&#xff09;是一種由…

java+mysql圖書管理系統

完整代碼地址 1.運行效果圖 2.主要代碼 2.1.連接數據庫 package com.my.homework.utils;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;public class JDBCUtils {public static Connection getConnection() throws Exception {…

Linux內核 -- Clocksource的注冊與使用

Linux Clocksource 使用教程 本文檔介紹了如何在Linux內核中實現和使用clocksource&#xff0c;并提供了內核態和用戶態使用clocksource的示例代碼。 1. Clocksource 驅動實現 以下是一個簡單的基于周期計數器的clocksource驅動實現示例。 1.1 定義clocksource結構體 #inc…

使用SQLMap進行SQL注入測試

使用SQLMap進行SQL注入測試 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 什么是SQL注入&#xff1f; SQL注入是一種常見的Web應用程序安全漏洞&#xff0c…

點云處理實戰 點云平面擬合

目錄 一、什么是平擬合 二、擬合步驟 三、數學原理 1、平面擬合 2、PCA過程 四、代碼 一、什么是平擬合 平面擬合是指在三維空間中找到一個平面,使其盡可能接近給定的點云。最小二乘法是一種常用的擬合方法,通過最小化誤差平方和來找到最優的擬合平面。 二、擬合步驟…

keepalived腦裂和haproxy

1.用keepalived管理nginx服務 7-1和7-2配置 #安裝nginx systemctl stop firewalld setenforce 0 yum install epel-release.noarch -y yum install -y nginx systemctl start nginxvim /etc/nginx/nginx.confupstream web {server 192.168.91.102;server 192.168.91.10…

2023-2024年中國人工智能算力的發展進行評估和分析報告

一、引言 隨著人工智能技術的不斷發展和應用,人工智能計算力已經成為推動人工智能產業發展的重要力量。本報告旨在對2023-2024年中國人工智能計算力的發展進行評估和分析,為相關企業和機構提供參考和決策依據。 二、人工智能發展邁入新階段 全球:生成式人工智能興起,產業步…

好久沒有寫博客了今天冒個泡記錄一下這兩個月的裸辭日記

辭職是2月份的事情了。目前已經4個月了。前2個月斷斷續續投簡歷面試&#xff0c;沒有遇到太理想的公司。現在武漢的公司太卷了。什么技術也都得會。一個前端希望你會切圖你會數據庫。有的還希望你處理一下售前售后。雙休的公司實在太少了&#xff0c;動不動就大小周。有個公司單…

筆記本電腦升級實戰手冊[1]:開始之前的準備與清單

文章目錄 前言&#xff1a;一、升級流程1. 備份2. 清灰換硅脂3. 擴展內存與硬盤4. 硬盤設置5. 系統重裝6. 升級后性能測試 二、升級清單1. 工具清單2. 升級清單 總結&#xff1a; 前言&#xff1a; 將要畢業之際&#xff0c;發現我的筆記本電腦已經陪我“征戰沙場”快有四年之…

【棧與隊列】滑動窗口最大值

題目&#xff1a;給你一個整數數組 nums&#xff0c;有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。 返回 滑動窗口中的最大值 。 分析&#xff1a;首先我們可以發現滑動窗口的移動操作和隊…

揭秘教學新利器:SmartEDA電路仿真軟件,讓電子學習更生動!

在數字化教育浪潮中&#xff0c;一款名為SmartEDA的電路仿真軟件逐漸嶄露頭角&#xff0c;以其直觀、易操作的特點&#xff0c;為電子學習領域帶來了革命性的變化。今天&#xff0c;就讓我們一起探討如何使用SmartEDA進行教學&#xff0c;讓電子學習變得更加生動有趣&#xff0…

使用Python實現深度學習模型:強化學習與深度Q網絡(DQN)

深度Q網絡(Deep Q-Network,DQN)是結合深度學習與強化學習的一種方法,用于解決復雜的決策問題。本文將詳細介紹如何使用Python實現DQN,主要包括以下幾個方面: 強化學習簡介DQN算法簡介環境搭建DQN模型實現模型訓練與評估1. 強化學習簡介 強化學習是一種訓練智能體(agent…