Android 應用及窗體事件的分發

 Android java application運行環境初始化簡介:
       在kernle啓動之後, 系統 將通過App_main進程來初始化android Runtime JAVA 運行環境,zygote是android的第一個進程,所有android的應用都是通過zygote fork出來的子進程。與QT不一樣的是系統調用fork啓動新進程而不再通過execv將子進程完全替換,這樣做的目的是每一個子進程都保留了JAVA VM所需的啓動信息比如JNI 信息。
       與Navtive 層一樣, JAVA application 層也有一個system service ,service 中啓動了很多的服務如ActivityManagerService,windowManagerService, powerManagerService等等,每啓動一個新的應用或者Service, ActivityManangerService都將爲該進程創建一個ApplicationThread客戶端,當有其他應用需要創建新的 Activity或者Bind Service時,system service 就會通過binder IPC 機制通知到相應的JAVA application。一旦JAVA Application在ActivityManangerService中創建了客戶端,則客戶端與客戶端,客戶端與Server的IPC連接都建立了,在Binder IPC通信中已經說了,對於需要IPC通信的兩個不同進程,只要獲得了對方在Binder Kernel中建立的Binder參考,就可以互相傳遞數據 了。應用由system service進程啓動,具體過程可以參考下面的示意圖,這裏就不貼源碼分析了。
       兩個重要的service:
       上面提到system service進程起來的過程過,啓動了很多的系統service,這中間有兩個service非常重要一個是ActivitManangerService,另一個是windowManagerService.

       AcvivityManagerService:
       主要管理Activity, service的加載,卸載,應用的創建等,當在一個應用程序中調用StartActivity時,應用就通過IPC機制向System Service請求啓動新的Activity,System Service首先會查找,這個Activity是否已經被創建,如果沒有,查找這個Activity所在的應用程序是否已經起來,如果沒有就先啓動應用。然後向此應用發送launchActivity消息創建Activity。

       WindowManagerService:
       主要管理 窗體的加載,事件的分發。啓動每個Activity系統都會創建一個viewRoot用於保存所有的view,通過viewRoot將窗體加載到 WindowManagerService並創建窗體的客戶端,當服務程序接收到按鍵事件後,就會查找當前窗體是否是焦點控件,如果是的話就會將窗體事件通過客戶端IPC傳遞到相應的應用程序,如果在焦點View中有註冊接收KeyEvent的消息則事件就在該view中得到處理。

原文地址:http://www.eoeandroid.com/thread-73361-1-7.html

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