Android 應用
初始化及表單事件(按鍵)的分發
---AlbertChen
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中得到處理。