假設(shè)一個(gè)App被啟動(dòng)了禽捆,界面成功顯示蕴茴,那么站在進(jìn)程的角度去看它后續(xù)的運(yùn)行過程胆屿,究竟是怎樣的呢?
當(dāng)App進(jìn)程啟動(dòng)完成之后婿牍,ActivityThread類被創(chuàng)建出來,他的main()方法執(zhí)行惩歉,執(zhí)行main()方法的這個(gè)線程稱作UI線程等脂。然后執(zhí)行Looper.prepareMainLooper(),此時(shí)UI線程的消息隊(duì)列已經(jīng)準(zhǔn)備好,可以通過Handler發(fā)送消息到該隊(duì)列了(后續(xù)與AMS的通訊正是通過這種方式執(zhí)行的)撑蚌。然后上遥,再執(zhí)行Looper.loop(),也就是阻塞的從消息隊(duì)列中去取消息(可以是用戶發(fā)的消息,也可以是系統(tǒng)發(fā)的消息)争涌,如果沒有粉楚,UI線程進(jìn)入睡眠狀態(tài)。
UI線程被喚醒的時(shí)機(jī):
用戶通過Handler向隊(duì)列中發(fā)送消息亮垫,此時(shí)queue.next()方法會(huì)被重新喚醒模软,并返回最新的消息
按鍵消息,即WMS向ViewRootImpl的內(nèi)部類W通信饮潦,此時(shí)該消息會(huì)被ViewRootImpl發(fā)送到UI線程的消息隊(duì)列中
3.Binder中斷燃异。當(dāng)應(yīng)用程序中創(chuàng)建了一個(gè)Binder,便會(huì)自動(dòng)創(chuàng)建一個(gè)線程用來接收消息继蜡,如ApplicationThread用來接收AMS的IPC消息回俐,如果在Binder線程中收到消息后向UI隊(duì)列中發(fā)送一條消息,那么next()方法也會(huì)被喚醒稀并。