精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Framework學習之input觸摸事件原理

移動開發 Android
對于觸摸事件會首先通過findTouchedWindowTargetsLocked找到目標Window,進而通過dispatchEventLocked將消息發送到目標窗口。

這幾天修改input驅動,InputManagerService過程介紹下:

1、輸入驅動系統簡單介紹

  • Android設備可以同時連接多個輸入設備,比如說觸摸屏,鍵盤,鼠標等等;
  • 用戶在任何一個設備上的輸入就會產生一個中斷,經由Linux內核的中斷處理以及設備驅動轉換成一個Event,并傳遞給用戶空間的應用程序進行處理;
  • 每個輸入設備都有自己的驅動程序,數據接口也不盡相同,如何在一個線程里(上面說過只有一個InputReader Thread)把所有的用戶輸入都給捕捉到? 這首先要歸功于Linux 內核的輸入子系統(Input Subsystem);
  •  它在各種各樣的設備驅動程序上加了一個抽象層,只要底層的設備驅動程序按照這層抽象接口來實現,上層應用就可以通過統一的接口來訪問所有的輸入設備;
  • 這個抽象層有三個重要的概念,input handler, input handle 和 input_dev,

圖片

  • input_dev代表底層驅動
  •  input_handler代表某類輸入設備的處理方法,相當于一個上層驅動
  • 一個input_dev 可以有多個input_handler,同樣,一個input_handler 可以用于多種輸入設備;
  • 用來關聯某個input_dev 和 某個 input_handler, 它對應上圖中的紫色的原點。每個input handle 都會生成一個文件節點;

input $ ls                                                        
event0 event1 event2 event3 event4 event5 event6

通過Linux input system獲取用戶輸入的流程簡單如下:

  • 設備通過input_register_dev 將自己的驅動注冊到Input 系統。
  • 各種Handler 通過 input_register_handler將自己注冊到Input系統中。
  • 每一個注冊進來的input_dev 或 Input_handler 都會通過input_connect() 尋找對方,生成對應的 input_handle,并在/dev/input/下產成一個設備節點文件.
  • 應用程序通過打開(Open)Input_handle對應的文件節點,打開其對應的input_dev 和 input_handler的驅動。這樣,當用戶按鍵時,底層驅動就能捕捉到,并交給對應的上層驅動(handler)進行處理,然后返回給應用程序。

2、InputManagerService詳解

2.1、InputManagerService啟動

InputManagerService是Android為了處理各種用戶操作而抽象的一個服務,自身可以看做是一個Binder服務實體,在SystemServer進程啟動的時候實例化,并注冊到ServiceManager中去,不過這個服務對外主要是用來提供一些輸入設備的信息的作用,作為Binder服務的作用比較小

private void startOtherServices() {
...
inputManager = new InputManagerService(context);
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore);
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
ServiceManager.addService(Context.INPUT_SERVICE, inputManager);
...
}

InputManagerService跟WindowManagerService幾乎同時被添加,從一定程度上也能說明兩者幾乎是相生的關系;

而觸摸事件的處理也確實同時涉及兩個服務,最好的證據就是WindowManagerService需要直接握著InputManagerService的引用;

如果對照上面的處理模型,InputManagerService主要負責觸摸事件的采集;

而WindowManagerService負責找到目標窗口。接下來,先看看InputManagerService如何完成觸摸事件的采集;

2.2、如何捕獲觸摸事件

InputManagerService會單獨開一個線程專門用來讀取觸摸事件,

NativeInputManager::NativeInputManager(jobject contextObj,
jobject serviceObj, const sp<Looper>& looper) :
mLooper(looper), mInteractive(true) {
...
sp<EventHub> eventHub = new EventHub();
mInputManager = new InputManager(eventHub, this, this);
}

  • 這里有個EventHub,它主要是利用Linux的inotify和epoll機制;
  • 監聽設備事件:包括設備插拔及各種觸摸、按鈕事件等,可以看做是一個不同設備的集線器,主要面向的是/dev/input目錄下的設備節點,比如說/dev/input/event0上的事件就是輸入事件,通過EventHub的getEvents就可以監聽并獲取該事件:

圖片

在new InputManager時候,會新建一個InputReader對象及InputReaderThread Loop線程,這個loop線程的主要作用就是通過EventHub的getEvents獲取Input事件

圖片

InputManager::InputManager(
const sp<EventHubInterface>& eventHub,
const sp<InputReaderPolicyInterface>& readerPolicy,
const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
<!--事件分發執行類-->
mDispatcher = new InputDispatcher(dispatcherPolicy);
<!--事件讀取執行類-->
mReader = new InputReader(eventHub, readerPolicy, mDispatcher);
initialize();
}
void InputManager::initialize() {
mReaderThread = new InputReaderThread(mReader);
mDispatcherThread = new InputDispatcherThread(mDispatcher);
}
bool InputReaderThread::threadLoop() {
mReader->loopOnce();
return true;
}
void InputReader::loopOnce() {
int32_t oldGeneration;
int32_t timeoutMillis;
bool inputDevicesChanged = false;
Vector<InputDeviceInfo> inputDevices;
{
...<!--監聽事件-->
size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);
....<!--處理事件-->
processEventsLocked(mEventBuffer, count);
...
<!--通知派發-->
mQueuedListener->flush();
}

輸入事件就可以被讀取,經過processEventsLocked被初步封裝成RawEvent,最后發通知,請求派發消息;

2.3、事件的派發

  • 在新建InputManager的時候,不僅僅創建了一個事件讀取線程;
  • 還創建了一個事件派發線程,雖然也可以直接在讀取線程中派發,但是這樣肯定會增加耗時,不利于事件的及時讀??;
  • 因此,事件讀取完畢后,直接向派發線程發個通知,請派發線程去處理,這樣讀取線程就可以更加敏捷,防止事件丟失,因此InputManager的模型就是如下樣式:

圖片

InputReader的mQueuedListener其實就是InputDispatcher對象,所以mQueuedListener->flush()就是通知InputDispatcher事件讀取完畢,可以派發事件了, InputDispatcherThread是一個典型Looper線程,基于native的Looper實現了Hanlder消息處理模型,如果有Input事件到來就被喚醒處理事件,處理完畢后繼續睡眠等待,代碼如下:

bool InputDispatcherThread::threadLoop() {
mDispatcher->dispatchOnce();
return true;
}
void InputDispatcher::dispatchOnce() {
nsecs_t nextWakeupTime = LONG_LONG_MAX;
{
<!--被喚醒 ,處理Input消息-->
if (!haveCommandsLocked()) {
dispatchOnceInnerLocked(&nextWakeupTime);
}
...
}
nsecs_t currentTime = now();
int timeoutMillis = toMillisecondTimeoutDelay(currentTime, nextWakeupTime);
<!--睡眠等待input事件-->
mLooper->pollOnce(timeoutMillis);
}

以上就是派發線程的模型,dispatchOnceInnerLocked是具體的派發處理邏輯,這里看其中一個分支,觸摸事件:

void InputDispatcher::dispatchOnceInnerLocked(nsecs_t* nextWakeupTime) {
...
case EventEntry::TYPE_MOTION: {
MotionEntry* typedEntry = static_cast<MotionEntry*>(mPendingEvent);
...
done = dispatchMotionLocked(currentTime, typedEntry,
&dropReason, nextWakeupTime);
break;
}
bool InputDispatcher::dispatchMotionLocked(
nsecs_t currentTime, MotionEntry* entry, DropReason* dropReason, nsecs_t* nextWakeupTime) {
...
Vector<InputTarget> inputTargets;
bool conflictingPointerActions = false;
int32_t injectionResult;
if (isPointerEvent) {
<!--關鍵點1 找到目標Window-->
injectionResult = findTouchedWindowTargetsLocked(currentTime,
entry, inputTargets, nextWakeupTime, &conflictingPointerActions);
} else {
injectionResult = findFocusedWindowTargetsLocked(currentTime,
entry, inputTargets, nextWakeupTime);
}
...
<!--關鍵點2 派發-->
dispatchEventLocked(currentTime, entry, inputTargets);
return true;
}

從以上代碼可以看出,對于觸摸事件會首先通過findTouchedWindowTargetsLocked找到目標Window,進而通過dispatchEventLocked將消息發送到目標窗口;

2.4、總結

現在把所有的流程跟模塊串聯起來,流程大致如下:

  • 點擊屏幕
  • InputManagerService的Read線程捕獲事件,預處理后發送給Dispatcher線程
  • Dispatcher找到目標窗口
  • 通過Socket將事件發送到目標窗口
  • 找到目標窗口處理事件
責任編輯:武曉燕 來源: Android開發編程
相關推薦

2011-08-03 17:32:17

IOS UIScrollVi touch

2013-04-15 15:22:06

2021-08-11 14:29:20

鴻蒙HarmonyOS應用

2016-12-08 22:59:47

觸摸事件android

2013-04-22 15:40:00

Android開發觸摸事件與點擊事件區別

2013-05-14 11:08:23

AIR Android觸摸事件鼠標事件

2017-01-11 18:44:43

React Nativ觸摸事件Android

2011-08-02 16:28:40

iPhone Web開發 事件

2011-06-23 14:05:32

Qt 事件機制

2010-01-05 10:29:43

.NET Framew

2009-08-18 11:08:24

.Net Framew

2012-06-01 10:27:44

Cocos2d觸摸分發原理

2011-09-13 10:07:10

PhoneGap

2017-12-21 15:42:08

iOS傳遞機制

2011-07-01 11:16:14

Struts

2023-10-12 22:44:16

iOS事件響應鏈

2016-06-13 15:53:34

SDN開放網絡操作系統ONOS

2013-07-25 15:19:23

iOS開發學習Xcode打包framiOS開發

2012-02-22 17:23:51

JavaPlay Framew

2013-09-17 14:00:19

AndroidListView原理
點贊
收藏

51CTO技術棧公眾號

欧美激情亚洲综合| 黄色手机在线视频| 欧美自拍偷拍第一页| a91a精品视频在线观看| 亚洲欧美一区二区三区四区| 91国产精品视频在线观看| av免费在线免费| av一本久道久久综合久久鬼色| 日韩av男人的天堂| 国产女人18毛片| 韩国av永久免费| 99精品视频在线| 日韩女优av电影| 凹凸日日摸日日碰夜夜爽1| www.天堂av.com| 亚洲一级在线| 美日韩精品视频免费看| 亚洲自拍偷拍一区二区| 人成在线免费网站| 18成人在线观看| 久久精品99久久久| 亚洲国产成人av好男人在线观看| 韩国成人动漫在线观看| 亚洲天堂999| 国产亚洲高清视频| 欧美成年人在线观看| 欧美黄色一级生活片| 成人av婷婷| 91精品国产欧美一区二区18 | www.日韩高清| 日本91福利区| 欧美性做爰毛片| 久久久久99精品成人片毛片| 色婷婷亚洲mv天堂mv在影片| 亚洲精品视频在线观看视频| 男女性杂交内射妇女bbwxz| 日韩三级成人| 欧美午夜精品久久久| 国产超级av在线| 激情视频网站在线播放色| 亚洲精品中文在线观看| 亚洲一区二区三区精品在线观看| 你懂得在线网址| 99re这里只有精品首页| 国产精华一区| 国产丝袜在线视频| 97欧美在线视频| 在线免费观看羞羞视频一区二区| 一级性生活大片| 久久久久97| 精品成人一区二区| 少妇精品无码一区二区| 激情视频亚洲| 亚洲国产va精品久久久不卡综合| 一区视频二区视频| 中文字幕在线播放| 欧美国产欧美综合| 午夜视频久久久| 精品国产亚洲一区二区麻豆| 久久91精品久久久久久秒播| 欧美激情2020午夜免费观看| 欧美成人国产精品高潮| 欧美黄色免费| 国产精品毛片在线| 亚洲一区二区三区四区在线 | 极品粉嫩美女露脸啪啪| jizz欧美| 91麻豆精品91久久久久同性| 久久出品必属精品| 91在线一区| 亚洲国产日韩欧美在线99| 国产91美女视频| 日韩伦理在线一区| 色呦呦国产精品| 91淫黄看大片| 亚洲国产aⅴ精品一区二区三区| 欧美色图免费看| 亚洲精品乱码久久久久久动漫| 日韩伦理一区二区| 日韩久久久精品| 免费a v网站| 国产成人一区| 色偷偷噜噜噜亚洲男人| 欧美 变态 另类 人妖| 希岛爱理av免费一区二区| 国产性色av一区二区| 少妇高潮在线观看| 久久综合色占| 日韩一级精品视频在线观看| 久久综合桃花网| 日韩在线观看不卡| 7777女厕盗摄久久久| 精品国产一二区| 亚洲专区视频| 日韩在线视频导航| 91丨精品丨国产| 黄色一级片网址| 黄色大片在线播放| 亚洲一二三四在线观看| 国产精品动漫网站| 亚洲网站三级| 日韩av在线最新| 国产真实乱在线更新| 99精品国产在热久久| 国产精品日韩在线| 日本精品一二区| 国产精品欧美久久久久一区二区| 免费在线看黄色片| 97精品国产99久久久久久免费| 国产九九在线| 韩国亚洲精品| 国产成一区二区| 性生交生活影碟片| 久久精品视频免费观看| 超碰10000| 亚洲www啪成人一区二区| 精品精品欲导航| 国产第一页精品| 成人精品中文字幕| 美女撒尿一区二区三区| 天堂网一区二区| 高清不卡一二三区| 伊人av成人| 三上悠亚激情av一区二区三区 | 亚洲色图综合区| 性欧美xxxx大乳国产app| 91免费在线视频| 电影在线一区| 亚洲va韩国va欧美va精品| 亚洲熟妇无码av在线播放| 亚洲成av在线| 亚洲国产成人精品女人久久久| 日本黄色激情视频| 久久亚洲风情| 国内精品一区二区| 久色国产在线| 日韩欧美国产wwwww| www.com.av| 麻豆精品一区二区综合av| 精品免费一区二区三区蜜桃| 日韩另类在线| 日韩三级电影网址| 欧美老熟妇一区二区三区| 免费观看在线色综合| 欧美日韩中文国产一区发布| av电影院在线看| 精品国产髙清在线看国产毛片| 91高清免费观看| 激情综合色播激情啊| 亚洲一区不卡在线| 亚洲tv在线| 久久久精品久久久| 国产精品国产三级国产普通话对白| 日本一区二区成人在线| 热久久精品免费视频| 成人看的羞羞网站| 国产日本欧美视频| 懂色av成人一区二区三区| 亚洲色图在线视频| 成人免费播放视频| 亚洲视频久久| 久久99精品国产99久久| 国产白浆在线免费观看| 精品国产乱码久久久久久久久| 国产精品19乱码一区二区三区| 国产成人午夜精品5599| 99亚洲国产精品| 涩涩屋成人免费视频软件| 久国内精品在线| 天堂在线视频网站| 欧美日韩激情视频| 国产精品jizz| 奇米777欧美一区二区| 一区二区三区四区五区视频| 精品99re| 97超级碰碰人国产在线观看| 一本色道久久综合熟妇| 成人欧美一区二区三区小说| 国产亚洲色婷婷久久| 激情综合自拍| 欧美久久久久久一卡四| 激情久久一区二区| 欧美精品videosex牲欧美| 手机看片福利在线观看| 一区二区三区精品在线| 日本一卡二卡在线| 日韩成人一级片| 大地资源第二页在线观看高清版| 亚洲一区网址| 日韩免费观看视频| 成人在线观看免费网站| 亚洲高清av在线| 国产三级理论片| 亚洲在线视频免费观看| 亚洲 小说 欧美 激情 另类| 九色综合国产一区二区三区| 久草视频这里只有精品| 精品理论电影| 国产精品二区三区四区| 日韩精品一区二区三区av| 欧美成人精品激情在线观看| 日产精品久久久久久久性色| 这里只有精品免费| 国产成人精品一区二三区| 亚洲欧美自拍偷拍色图| 中出视频在线观看| 国产精品一区在线观看你懂的| 欧美网站免费观看| 麻豆视频一区| 91精品国产综合久久久久久蜜臀 | 99草在线视频| 在线免费观看日本一区| 清纯粉嫩极品夜夜嗨av| 日本一区二区三区免费乱视频| 欧美xxxxx少妇| 久久99国产精品麻豆| 日韩在线第三页| 一本综合久久| 蜜臀精品一区二区| 欧美激情国产在线| 欧美重口乱码一区二区| 粉嫩一区二区三区四区公司1| 国产精品专区h在线观看| 蜜桃麻豆av在线| 欧美日韩福利在线观看| 国产美女福利在线| 一区二区欧美在线| 欧洲一级在线观看| 日韩国产在线播放| 亚洲国产精品国自产拍久久| 7777精品伊人久久久大香线蕉经典版下载 | 国产精品人人爽| 日本高清视频一区二区| 久久精品一级片| 综合av第一页| 免费成人美女女在线观看| xnxx国产精品| 国产精品伦子伦| 成人动漫中文字幕| 佐佐木明希电影| 国产精品综合一区二区三区| 999这里有精品| 久久99精品久久久| 亚洲最大综合网| 日本欧美韩国一区三区| 日韩av播放器| 久久久蜜桃一区二区人| 久久久久免费精品| 免费看的黄色欧美网站| 国产精品333| 国产偷自视频区视频一区二区| 国产高清www| 亚洲美女色禁图| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 亚洲一卡久久| 国产极品美女高潮无套久久久| 久久久一二三| 一区二区三区网址| 久久66热re国产| 国产人妻精品久久久久野外| 国产精品一级在线| 亚洲免费观看在线| av一区二区三区四区| 99久久久久久久久久| 久久久国产精品不卡| 69xxx免费| 国产精品久久777777| 九九精品视频免费| 亚洲综合久久av| 日韩精品乱码久久久久久| 狠狠躁天天躁日日躁欧美| 国产嫩bbwbbw高潮| 欧美日韩在线不卡| 精品毛片一区二区三区| 亚洲成**性毛茸茸| 毛片网站在线| 精品国产一区二区三区四区在线观看 | 国产区视频在线播放| www.日本久久久久com.| 四虎av在线| 日本成人激情视频| 精品久久福利| 国产aⅴ精品一区二区三区黄| 日本一道高清一区二区三区| 午夜精品视频在线观看一区二区| 影音先锋日韩在线| 欧美亚洲精品一区二区| 日本中文一区二区三区| 国内av免费观看| 99久久久国产精品免费蜜臀| 日本美女xxx| 亚洲线精品一区二区三区| www.国产一区二区| 91精品国产综合久久久久| 天天综合在线视频| zzjj国产精品一区二区| 爱看av在线入口| 国产精品日日做人人爱| 一区二区在线免费播放| 日韩免费一区二区三区| 黑丝一区二区| 在线免费av播放| 97se狠狠狠综合亚洲狠狠| 免费成人深夜蜜桃视频| 欧美日韩午夜剧场| 国产男女猛烈无遮挡| 国产亚洲一区二区在线| 国产精品国精产品一二| 国产热re99久久6国产精品| 欧美激情久久久久久久久久久| 一本久道久久综合| 久久久久久自在自线| 扒开伸进免费视频| 1024成人网| 亚洲男人天堂网址| 日韩大陆欧美高清视频区| 91在线中字| 国产欧美精品在线播放| 蜜桃视频欧美| 免费毛片网站在线观看| 国产一区二区导航在线播放| 天天综合成人网| 久久综合色播五月| 国产在线拍揄自揄拍| 欧美乱熟臀69xxxxxx| 国产福利小视频在线观看| 91精品国产91| 9l视频自拍蝌蚪9l视频成人| 一区二区视频在线观看| 日韩av网站在线观看| 免费成人深夜夜行p站| 一区二区三区欧美| 国产精品一区二区黑人巨大| 丝袜美腿精品国产二区| 免费欧美电影| 欧美伦理一区二区| 一本色道久久综合一区| 中文字幕无码人妻少妇免费| 一区二区三区国产精品| 国产成人久久精品77777综合| 日韩性xxxx爱| 不卡一区视频| 日本丰满少妇黄大片在线观看| 蜜桃久久久久久| 久久久久久久久福利| 在线精品观看国产| av在线三区| 国产精品视频永久免费播放| 国产成人3p视频免费观看| 日本三级免费观看| 久久综合狠狠综合久久综合88| 中文字幕在线观看免费视频| 亚洲精品xxxx| 牛牛精品一区二区| 老司机精品福利在线观看| 亚洲永久免费| 亚洲精品色午夜无码专区日韩| 色综合久久精品| 爱久久·www| 91精品久久久久久久久不口人| 欧美岛国激情| 久久久久久久久久久影视| 亚洲一区二区三区四区中文字幕| 丰满人妻一区二区三区免费视频| 久久青草福利网站| 亚洲www啪成人一区二区| 亚洲v国产v| 九一九一国产精品| 国产一级片免费看| 亚洲精品小视频| 国产成人免费| 黄色一级大片免费| 91年精品国产| 亚洲视频在线免费播放| 久久成人国产精品| 国产劲爆久久| 日韩一级片播放| 亚洲乱码国产乱码精品精可以看| 蜜臀久久99精品久久久| 欧美资源在线观看| 欧美大片aaaa| 国产日韩视频一区| 欧美中文字幕一二三区视频| 成人短视频在线| 精品无人区一区二区三区| 免费观看日韩电影| 国产亚洲精品久久久久久打不开| 亚洲美女在线观看| 懂色av色香蕉一区二区蜜桃| www.av毛片| 中文字幕免费一区| 丰满肉嫩西川结衣av| 国产91九色视频| 欧美淫片网站| 波多野在线播放| 欧美成人女星排行榜| 你懂得影院夜精品a| 日韩精品综合在线| 国产精品欧美经典| 亚洲 精品 综合 精品 自拍|