iOS應事件的生命週期

1.手指觸碰屏幕,屏幕感應到觸碰後,將事件交由IOKit處理。

2.IOKit將觸摸事件封裝成一個IOHIDEvent對象,並通過mach port傳遞給SpringBoad進程。

mach port 進程端口,各進程之間通過它進行通信。

SpringBoad.app 是一個系統進程,可以理解爲桌面系統,可以統一管理和分發系統接收到的觸摸事件。

  1. SpringBoard進程因接收到觸摸事件,觸發了主線程runloop的source1事件源的回調。

此時SpringBoard會根據當前桌面的狀態,判斷應該由誰處理此次觸摸事件。因爲事件發生時,你可能正在桌面上翻頁,也可能正在刷微博。若是前者(即前臺無APP運行),則觸發SpringBoard本身主線程runloop的source0事件源的回調,將事件交由桌面系統去消耗;若是後者(即有app正在前臺運行),則將觸摸事件通過IPC傳遞給前臺APP進程,接下來的事情便是APP內部對於觸摸事件的響應了。

APP響應階段

1.APP進程的mach port接受到SpringBoard進程傳遞來的觸摸事件,主線程的runloop被喚醒,觸發了source1回調。

2.source1回調又觸發了一個source0回調,將接收到的IOHIDEvent對象封裝成UIEvent對象,此時APP將正式開始對於觸摸事件的響應。

3.source0回調內部將觸摸事件添加到UIApplication對象的事件隊列中。事件出隊後,UIApplication開始一個尋找最佳響應者的過程,這個過程又稱hit-testing,細節將在[尋找事件的最佳響應者]一節闡述。另外,此處開始便是與我們平時開發相關的工作了。

4.尋找到最佳響應者後,接下來的事情便是事件在響應鏈中的傳遞及響應了,關於響應鏈相關的內容詳見[事件的響應及在響應鏈中的傳遞]一節。事實上,事件除了被響應者消耗,還能被手勢識別器或是target-action模式捕捉並消耗掉。其中涉及對觸摸事件的響應優先級,詳見[事件的三徒弟UIResponder、UIGestureRecognizer、UIControl]一節。

5.觸摸事件歷經坎坷後要麼被某個響應對象捕獲後釋放,要麼致死也沒能找到能夠響應的對象,最終釋放。至此,這個觸摸事件的使命就算終結了。runloop若沒有其他事件需要處理,也將重歸於眠,等待新的事件到來後喚醒。

現在,你可以回答第一個問題了。觸摸事件從觸屏產生後,由IOKit將觸摸事件傳遞給SpringBoard進程,再由SpringBoard分發給當前前臺APP處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章