2013-01-31 15:13
295人閱讀收藏
舉報 事件系統簡介
1.android
事件系統,它解決的是如何將按鍵、滑鼠、觸屏訊息從收集到最終將之傳送到焦點視窗進行處理的問題
2.android
事件處理
流程分兩部分,一部分是從
framework
開始,如何
從底層讀取事件並分發
給activity
。一部分是從核心開始,如何從觸控螢幕讀取
裝置事件並帶到上層
3.eventhub
它是系統所有事件的**處理站,從驅動檔案讀取
rawevent
inputreader
利用eventhub
讀取raw
事件,並進行轉化分類
inputdispatcher
將inputreader
讀取的事件分發到各目標
viewroot
從管道接收到事件訊息並帶給
activity處理
訊息系統啟動
訊息系統服務跟隨
windowmanagerservice
一起啟動,
隨後在本地層建立
inputreader
和inputdispatch
完成事件的讀取、分發工作.
事件傳遞總體原理
1.android
事件傳遞的設計核心是管道(
channel
)通訊機制
2.android
按鍵、觸屏等輸入事件經由跟
windowmanagerservice
初始化的
inputmanager
系統獲取,並通過管道方式傳遞給
viewroot
,viewroot
再下發至
的view
。當有事件從硬體裝置輸入時,inputreader
會檢測到事件的發生,並傳遞給inputdispatcher進行分發,inputdispatcher通過管道(
pipe
)傳遞給
由圖可知,
activity
建立時會最終呼叫到
windowmanagerservice.addwindow
()函式。這裡會利用
socketpair
()建立2個
socket
描述符,它們可以進行雙工通訊。最後它們以
inputchannel
方式儲存在乙個
2元陣列裡面。並且返回乙個fd給
viewroot
通訊。然後
windowmanagerservice
繼續呼叫
minputmanager.registerinputchannel
,將另乙個
fd繼續傳遞到
inputpublisher
,這個負責分發事件的類。
viewroot
也會將fd
傳到本地層的
inputconsumer
中,也就是說只要
inputpublisher
傳送了訊息,
inputconsumer
就能馬上收到。這樣
viewroot
和底層的事件分發類
inputdispatcher
之間的管道就建立起來了,並且可以進行雙工通訊
訊息的獲取與分發
inputdispatcher
和inputreader
分別用於分發和讀取事件。其中
inputdispatcher
會呼叫dispatchonce
()不斷分發事件,
inputreader
呼叫looponce
()不斷地讀取事件。詳細見以下圖,看
inputreader
如何將事件傳到
inputdispatcher
再傳到viewroot
。以下都是以鍵盤事件為例。
將事件送入管道後,就會喚醒,另一端等待事件處理的程序
nativeinputeventreceiver
會呼叫handleevent
處理事件。見下圖
activity呼叫dispatchkeyevent的時候,裡面會呼叫receiver.onkeydown(),receiver是activity自己。所以過載activity的dispatchkeyevent()可以自定義按鍵,如果沒有dispatchkeyevent,過載onkeydown()也可以。
系統級事件處理
如果是系統事件,將不會分發給應用程式,有兩個地方
inputdispatcher.notifykey
在加入佇列之前
inputdispatcher.dispatchkeylocked
在分發之前
這兩各都可以攔截事件,交給系統視窗處理
android4 0上網設定
很多也問到為啥自己在家的pc機可以上網,而執行在pc機上面的android模擬器卻不能上網呢?是因為家裡的pc機的dns一般為 192.168.1.1,這個只是一般而言,不是絕對,這個得自己使用ipconfig all命令檢查下 而模擬器預設的dns為 10.0.2.3,那麼模擬器跟自己的pc就不在...
android 4 0開機啟動服務
網上找了幾個方法 第一,寫乙個很簡單的程式,就乙個activity,指此activity標題欄去掉,背景全透明,然後在此activity的oncreate將自己finish 掉,什麼都不用幹,只要在manifest.xml中申明開機服務就ok,然後在程式內部響應此開機服務。下面 就是這種方式 第二,...
ANDROID4 0 裁剪與定製
android4.0 裁剪與定製 技術類別 嵌入式 android系統4層架構 應用層,框架層,執行庫層,核心層 之間,應用層通過框架對使用到庫進行呼叫 核心負責記憶體管理程序排程等。通過在不同層上的裁剪可以實現部分功能的移出。例如 應用層上移出apk,相應應用無法使用 執行庫層移出執行所需的庫檔案...