精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

蜜乳av一区| 亚洲天天综合网| 精品久久对白| 91成人网在线| 青青草免费在线视频观看| 黄色福利在线观看| 日本午夜精品视频在线观看 | 777电影在线观看| 国产美女一区二区三区| 日韩av免费看| 久久精品www| 精品视频97| 亚洲成av人片在线观看香蕉| 欧美男女交配视频| 国产夫妻在线播放| 亚洲婷婷在线视频| 日韩福利二区| 熟妇人妻一区二区三区四区| 老司机精品视频导航| 欧美专区在线观看| 国产精品成人久久| 亚洲电影影音先锋| 这里只有精品久久| 日韩精品卡通动漫网站| 永久免费精品视频| 51精品视频一区二区三区| 91看片就是不一样| 日本不卡1234视频| 亚洲一区在线电影| 老司机午夜网站| 91精品国产综合久久久久久豆腐| 99国产精品视频免费观看| 亚洲va欧美va在线观看| 在线观看免费黄色小视频| 亚洲尤物精选| 97精品视频在线播放| 69av.com| 中文字幕一区二区三区在线视频 | 久久av一区| 97视频免费看| 国产精品第九页| 欧美日韩精品免费观看视频完整| 视频直播国产精品| 国产不卡在线观看视频| 国产欧美日韩在线一区二区| 日韩av在线网站| 香港三级日本三级| 久久香蕉网站| 亚洲精品成人网| 国产精品嫩草av| 日韩av中文字幕一区| 日韩av网址在线| 久久人人妻人人人人妻性色av| 国产精品自在| 日韩国产欧美精品一区二区三区| 日本人添下边视频免费| 久久精品亚洲成在人线av网址| 亚洲第一视频网站| 欧美做受高潮中文字幕| 欧美成人一区在线观看| 亚洲精品视频在线播放| 亚洲综合网在线观看| 精品久久久亚洲| 日韩在线视频线视频免费网站| 久久嫩草捆绑紧缚| 狠狠爱www人成狠狠爱综合网| 久久久久久久爱| 免费观看一区二区三区毛片| 免费久久99精品国产自在现线| 热99精品里视频精品| 国产无遮挡又黄又爽又色视频| 日本不卡视频在线观看| 91在线视频成人| 丰满熟妇人妻中文字幕| 96av麻豆蜜桃一区二区| 日韩女优中文字幕| 黄页视频在线播放| 亚洲午夜av在线| 久久精品99国产| 久久精品资源| 精品区一区二区| 熟女俱乐部一区二区视频在线| 日韩成人免费| 欧美国产亚洲视频| 亚洲自拍一区在线观看| 精品午夜久久福利影院 | 中日韩免视频上线全都免费| 在线免费看av不卡| 欧美精品xxxxx| 欧美资源在线| 亚洲一区二区少妇| 欧洲视频在线免费观看| 亚洲欧美区自拍先锋| av免费观看网| 国产精品99久久免费| 亚洲国产欧美一区二区丝袜黑人 | 性欧美欧美巨大69| 午夜精品一区二区三区在线| 中文字幕av网站| 成人国产精品免费观看视频| 亚洲一区高清| 日韩av影片| 日韩欧美一区二区不卡| 免费看污片的网站| 一区二区亚洲| 国产在线精品播放| 韩国中文字幕2020精品| 亚洲综合一区二区精品导航| 美女网站色免费| 奇米影视777在线欧美电影观看| 爱福利视频一区| 亚洲成人第一网站| 成人av综合一区| 无码人妻aⅴ一区二区三区日本| 粉嫩一区二区三区| 亚洲国产日韩欧美综合久久 | 午夜久久福利| 国产精品美女www| 神马午夜一区二区| 一区二区三区久久| 午夜精品久久久久久久99热影院| 在线日韩网站| 66m—66摸成人免费视频| 精品人妻少妇嫩草av无码专区| 日本一区二区视频在线| 1024av视频| 群体交乱之放荡娇妻一区二区| 欧美成人激情视频| 11024精品一区二区三区日韩| 久久先锋影音av鲁色资源网| 国产日韩av网站| 凹凸av导航大全精品| 久久精品最新地址| 在线观看中文字幕av| 国产人成一区二区三区影院| 可以免费观看av毛片| 日韩激情毛片| 2019中文字幕在线| 少妇精品视频一区二区| 性欧美大战久久久久久久久| 精品熟女一区二区三区| 国产字幕视频一区二区| 97超碰人人看人人| 欧美大片黄色| 亚洲第一精品夜夜躁人人爽| 久视频在线观看| 成人性生交大片免费看中文| 很污的网站在线观看| heyzo欧美激情| 久久久久国产精品一区| 蜜桃视频污在线观看| 亚洲午夜久久久久久久久电影网| 97中文字幕在线观看| 激情欧美一区二区三区| 国产精品三区在线| 678在线观看视频| 日韩国产在线播放| 国产免费一级视频| 国产精品蜜臀av| 在线免费观看av网| 欧美视频在线观看| 国产区一区二区三区| 色戒汤唯在线观看| 夜夜躁日日躁狠狠久久88av| 911美女片黄在线观看游戏| 成人欧美一区二区三区视频网页| 毛片毛片毛片毛片毛| 亚洲高清自拍| 欧美日韩一区二 | 国产精品av久久久久久无| 免费观看在线综合色| 午夜在线视频免费观看| 97久久综合精品久久久综合| 66m—66摸成人免费视频| 国产黄色片在线观看| 欧美高清hd18日本| 日韩激情一区二区三区| 久久夜色精品一区| 超碰人人草人人| 影音先锋在线一区| 日韩成人在线资源| 久久国产精品美女| 2019中文字幕在线观看| 欧美日韩在线资源| 欧美videossexotv100| 色一情一乱一伦| 日韩一区有码在线| 美国黄色一级毛片| 国内成人精品2018免费看| 男女高潮又爽又黄又无遮挡| 日韩精品dvd| 精品一区二区国产| 高清国产一区二区三区四区五区| 久久久久国产精品一区| 97电影在线看视频| 亚洲国产精品人久久电影| 国产亚洲久一区二区| 亚洲大型综合色站| 美女网站视频色| 91在线小视频| 五月天国产视频| 久久综合狠狠| 日韩一二区视频| 精品国产精品国产偷麻豆| 91嫩草免费看| 精品国产黄a∨片高清在线| 久久久久久久久久国产精品| 天堂中文а√在线| 亚洲欧美日韩网| 亚洲男人天堂久久| 欧美精品在线观看一区二区| 国产三级av片| 亚洲第一狼人社区| 免费在线黄色网| 国产精品卡一卡二| 一本加勒比北条麻妃| 成人晚上爱看视频| 成人免费黄色av| 久久精品国产网站| 欧美精品aaaa| 免费看的黄色欧美网站| 免费av手机在线观看| 欧美成人精品| 亚洲免费视频播放| 999久久久国产精品| 天天综合狠狠精品| 国内黄色精品| 欧美日韩在线不卡一区| 国产精品自在线拍| 国产美女99p| 91麻豆精品激情在线观看最新| 成人av色在线观看| 欧美高清免费| 91精品久久久久久久久中文字幕| 黄瓜视频成人app免费| 欧美做受高潮1| 亚洲一二三四| 青青青国产精品一区二区| 性爽视频在线| 奇门遁甲1982国语版免费观看高清| 欧美性猛片xxxxx免费中国| 麻豆一区二区在线观看| 超碰个人在线| 欧美美最猛性xxxxxx| 2021国产在线| 欧美人成在线视频| 搞黄网站在线看| 隔壁老王国产在线精品| 91精品国产黑色瑜伽裤| 久久乐国产精品| av剧情在线观看| 全球成人中文在线| 成人自拍视频网| 成人国产精品av| 美国十次综合久久| 国产精品永久入口久久久| 另类ts人妖一区二区三区| 久久久com| 成久久久网站| 黄色影视在线观看| 激情文学一区| 欧美日韩一区二区在线免费观看| 久久字幕精品一区| 亚洲三级在线观看视频| 国产成人精品亚洲777人妖| 色哟哟视频在线| www国产亚洲精品久久麻豆| 蜜乳av中文字幕| 一区免费观看视频| 国产稀缺真实呦乱在线| 色综合久久综合网欧美综合网| 香蕉污视频在线观看| 91精品综合久久久久久| 日韩一级免费视频| 亚洲最新中文字幕| 中文字幕伦理免费在线视频| 性色av一区二区三区| ww久久综合久中文字幕| 91精品天堂| 国产成人调教视频在线观看 | 97蜜桃久久| 国产精品va在线播放我和闺蜜| 国产麻豆一区| 国产99午夜精品一区二区三区 | 蜜臀99久久精品久久久久小说 | 国产精品毛片久久| 国产美女在线一区| 理论电影国产精品| jlzzjizz在线播放观看| 国产精品免费视频一区| 久久一区二区三| 欧美无砖专区一中文字| 丰满人妻一区二区三区四区53 | 国产一二三区精品| 欧美午夜激情在线| 国产日韩一级片| 亚洲欧美日韩国产中文专区| 视频在线这里都是精品| 国产精品极品美女在线观看免费| 一区三区自拍| 亚洲一二三区精品| 国产精品入口| 99久久综合网| 国产精品素人一区二区| 天天操天天射天天爽| 欧美日韩免费高清一区色橹橹 | 欧美激情在线观看| 久久婷婷五月综合色丁香| 黑人中文字幕一区二区三区| 97精品视频| 国产精品沙发午睡系列| 国产传媒日韩欧美成人| www久久久久久久| 黄色成人在线免费| www.四虎在线观看| 日韩视频精品在线| 蜜桃视频成人m3u8| 久久伦理网站| 雨宫琴音一区二区在线| 一级黄色免费毛片| 国产精品国产成人国产三级| 日韩人妻精品中文字幕| 亚洲精品狠狠操| 色爱综合区网| 97人人模人人爽视频一区二区| 999国产精品| 一区二区三区 日韩| 久久久国产午夜精品| av黄色在线播放| 精品视频在线播放免| freexxx性亚洲精品| 粉嫩精品一区二区三区在线观看 | 九九久久国产精品| 电影一区二区三区久久免费观看| 亚洲欧美日韩精品久久久| 久久久久99| 成人片黄网站色大片免费毛片| 精品久久久久久国产91| 手机在线不卡av| 98精品国产高清在线xxxx天堂| av成人app永久免费| 少妇大叫太大太粗太爽了a片小说| 韩国v欧美v日本v亚洲v| 成年人二级毛片| 日韩一区二区精品葵司在线| 国产三级在线播放| 91九色在线免费视频| 欧美精品福利| 精品少妇人妻av一区二区三区| 亚洲国产精品欧美一二99| 欧美一级淫片aaaaaa| 久久免费视频在线观看| julia中文字幕一区二区99在线| 日本男女交配视频| 成人av手机在线观看| 国产成人无码一区二区三区在线| 亚洲成人精品视频在线观看| 国产乱码精品一区二三赶尸艳谈| 久久久精品国产一区二区三区| 国产精品亚洲综合色区韩国| brazzers精品成人一区| 欧美三级中文字| 综合图区亚洲| 国产一区二区三区四区五区加勒比| 国产欧美日韩一级| 神马久久久久久久久久久| 欧美丰满少妇xxxxx高潮对白| av免费网站在线| 国产综合精品一区二区三区| 久久xxxx| 中文乱码字幕高清一区二区| 精品女同一区二区| 成年美女黄网站色大片不卡| 午夜精品一区二区三区四区| 国产精品一区在线| av资源免费观看| www.亚洲男人天堂| 福利片一区二区| 91制片厂毛片| 亚洲图片欧美一区| 毛片在线播放网址| 91久久在线观看| 国产精品嫩草99av在线| 亚洲熟女毛茸茸| 日韩精品免费在线视频观看| 四虎影视精品永久在线观看| 国产一线二线三线女| 国产日产欧美一区二区三区| 精品人妻伦一二三区久久| 国产成人精品在线观看| 欧美精品自拍| 日本一级免费视频| 精品蜜桃在线看| 精品自拍视频| 91猫先生在线| 一区二区三区在线观看欧美| 福利视频在线导航| 国产精品美女诱惑| 久久国产精品99久久人人澡| 久久久久久久久久免费视频|