Android应用程序键盘(Keyboard)消息处理机制分析(3)
??? ? ? ?Step 15. Looper.pollOnce
?? ? ? ?這個(gè)函數(shù)定義在frameworks/base/libs/utils/Looper.cpp文件中,具體可以參考前面Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析一文,這里就不再詳述了。總的來說,就是在Looper類中,會(huì)創(chuàng)建一個(gè)管道,當(dāng)調(diào)用Looper類的pollOnce函數(shù)時(shí),如果管道中沒有內(nèi)容可讀,那么當(dāng)前線程就會(huì)進(jìn)入到空閑等待狀態(tài);當(dāng)有鍵盤事件發(fā)生時(shí),InputReader就會(huì)往這個(gè)管道中寫入新的內(nèi)容,這樣就會(huì)喚醒前面正在等待鍵盤事件發(fā)生的線程。
?? ? ? ?InputDispatcher類分發(fā)消息的過程就暫時(shí)分析到這里,后面會(huì)有更進(jìn)一步的分析,現(xiàn)在,我們回到Step 12中,接著分析InputReader類讀取鍵盤事件的過程。在調(diào)用了InputReaderThread線程類的run就函數(shù)后,同樣會(huì)進(jìn)入到InputReaderThread線程類的threadLoop函數(shù)中去。
?? ? ? ?Step 16. InputReaderThread.threadLoop
?? ? ? ?這個(gè)函數(shù)定義在frameworks/base/libs/ui/InputReader.cpp文件中:
?? ? ??這里的成員變量mReader即為在前面Step 8中創(chuàng)建的InputReader對(duì)象,調(diào)用它的loopOnce成員函數(shù)執(zhí)行一次鍵盤事件的讀取操作。
?
?? ? ? Step 17. InputReader.loopOnce
?? ? ??這個(gè)函數(shù)定義在frameworks/base/libs/ui/InputReader.cpp文件中:
?? ? ? ?這里通過成員函數(shù)mEventHub來負(fù)責(zé)鍵盤消息的讀取工作,如果當(dāng)前有鍵盤事件發(fā)生或者有鍵盤事件等待處理,通過mEventHub的getEvent函數(shù)就可以得到這個(gè)事件,然后交給process函數(shù)進(jìn)行處理,這個(gè)函數(shù)主要就是喚醒前面的InputDispatcherThread線程,通知它有新的鍵盤事件發(fā)生了,它需要進(jìn)行一次鍵盤消息的分發(fā)操作了,這個(gè)函數(shù)我們后面再進(jìn)一步詳細(xì)分析;如果沒有鍵盤事件發(fā)生或者沒有鍵盤事件等待處理,那么調(diào)用mEventHub的getEvent函數(shù)時(shí)就會(huì)進(jìn)入等待狀態(tài)。
?
?
轉(zhuǎn)載于:https://blog.51cto.com/shyluo/966612
總結(jié)
以上是生活随笔為你收集整理的Android应用程序键盘(Keyboard)消息处理机制分析(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Catalyst 2950/2955交换
- 下一篇: 读书之境界