APK程序的運行過程

文章出處:http://blog.csdn.net/wenxuzl99/article/details/16947249


首先,ActivityThread從main()函數中開始執行,調用prepareMainLopper()爲UI線程創建一個消息隊列(MessageQueue)。

    然後創建一個ActivityThread對象,在ActivityThread的初始化代碼中會創建一個H(Handler)對象和一個ApplicationThread(Binder)對象。其中Binder負責接收遠程AmS的IPC調用,接收到調用後,則通過Handler把消息發送到消息隊列,Ui主線程會異步的從消息隊列中取出消息並執行相應的操作,比如start、stop、pause等。

    接着UI主線程調用Looper.loop()方法進入消息循環體,進入後就會不斷地從消息隊列中讀取並處理消息。

    當ActivityThread接收到AmS發送start某個Activity後,就會創建指定的Activity對象。Activity又會創建PhoneWindow類->DecorView類->創建相應的View後者ViewGroup。創建完成後,Activity需要把創建好的界面顯示到屏幕上,於是調用WindowManager類,後者於是闖將一個ViewRoot對象。該對象實際上創建了ViewRoot類和W類,創建ViewRoot對象後,WindowManager再調用WnS提供的遠程接口完成添加一個窗口並顯示到屏幕上。

 接下來,用戶開始在程序界面上操作。KeyQ線程不斷把用戶消息存儲到QueueEvent隊列中,InputDispatcherThread線程逐個取出消息,然後調用WmS中的相應函數處理該消息。當WmS發現該消息屬於客戶端某個窗口時,就會調用相應窗口的W接口。

    W類是一個Binder,負責接收WmS的IPC調用,並把調用消息傳遞給ViewRoot,ViewRoot再把消息傳遞給UI主線程ActivityThread,ActivityThread解析該消息並做相應的處理。在客戶端程序中,首先處理消息的是DecorView,如果DecorView不想處理某個消息,則可以將該消息傳遞給其內部包含的子View或者ViewGroup,如果還沒有處理,則傳遞給PhoneWindow,最後在傳遞給Activity.


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