Android 4 0 事件系統

2021-06-19 04:31:27 字數 2938 閱讀 7364

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,相應應用無法使用 執行庫層移出執行所需的庫檔案...