目錄
- 代碼流程
- 參考鏈接
- 延展閱讀
代碼流程
用戶點(diǎn)擊了桌面上的某個(gè)app圖標(biāo),
從Launcher開(kāi)始(Launcher也是一個(gè)app)
-
Launcher.startShortcutOrInfoActivity(View)
它這里的形參view逝淹,通過(guò)view.tag 拿到intent信息
-
Launcher.startActivitySafely(View, Intent, Object)
可以認(rèn)為是個(gè)包裝方法
-
Launcher.startActivity(View, Intent, Object)
這里處理用戶信息(看是游客還是管理員身份),最終把傳遞進(jìn)來(lái)的intent加上FLAG_NEW_TASK
-
Launcher.startActivityForResult
從點(diǎn)擊桌面啟動(dòng)器的按鈕開(kāi)始缓待,到最終把意圖傳遞出去,到這里就是Launcher的作用了渠牲。
-
Instrument.execStartActivity
可能會(huì)問(wèn)Instrumentation類的作用旋炒,ActivityThread對(duì)Activity生命周期的調(diào)用具體通過(guò)這個(gè)類實(shí)現(xiàn)
-
ActivityManageProxy.startActivity
Instrument類去調(diào)用AMS(AMP是AMS的代理類,真正的實(shí)現(xiàn)類)
這里完成了Launcher點(diǎn)擊啟動(dòng)的應(yīng)用的動(dòng)畫(huà)(通過(guò)WMS實(shí)現(xiàn)签杈,不重要)瘫镇,完成了信息的保存
這里全部都是AMS,WMS答姥,Instrument铣除,binder的交互,可以發(fā)散問(wèn) binder跨進(jìn)程通信的原理
AMS.startProcessLocked-----這里是Process創(chuàng)建新進(jìn)程鹦付,由Zygote.fork出一個(gè)新進(jìn)程
Zygote.fork新進(jìn)程成功后尚粘,會(huì)反射invokeActivityThread的main方法,也就是整個(gè)程序的入口函數(shù)
附app啟動(dòng)的部分代碼調(diào)用棧(源碼來(lái)自API 28)
···
Process::start
ZygoteProcess::start
ZygoteProcess::startViaZygote
ZygoteProcess::openZygoteSocketIfNeeded
--ZygoteState::connect(ZygoteState是ZygoteProcess的靜態(tài)內(nèi)部類)
--connect方法通過(guò)LocalSocket完成通信敲长,Zygote孵化一個(gè)新的進(jìn)程
ZygoteProcess::zygoteSendArgsAndGetResult(處理新進(jìn)程)
通信的接收方見(jiàn)zygoteSendArgsAndGetResult方法內(nèi)注釋
SystemZygoteInit.readArgumentList()--可是我沒(méi)找到這個(gè)方法郎嫁,有誰(shuí)找到了告知一下,我找的是API 26的ZygoteInit類
ZygoteInit::main
--zygoteServer::registerServerSocketFromEnv
--內(nèi)部創(chuàng)建了一個(gè)LocalServerSokcet
···
以上部分是launcher和ams的交互,以下就是真正的app入口方法潘明,真正的起點(diǎn)
ActivityThread.main里最重要的方法就是新創(chuàng)建了一個(gè)looper并循環(huán)行剂,內(nèi)部的attach方法進(jìn)行所有的初始化功能
首先進(jìn)行AMS.attachApplication
-
通過(guò)AMS.bindApplication 進(jìn)程綁定到該application
這里的AMS里起作用的thread實(shí)例實(shí)際是ActivityThreadProxy代理類
最后發(fā)送一個(gè)H_BIND_APPLICATION的msg給handler,通知綁定完成
-
接收到msg后
- Instrument.onCreate
- LoadApk.makeApplication
- Instrument.newApplication
- Application.attach
至此完成Application的綁定和初始化
ContentProvider.OnCreate方法會(huì)先于Application.OnCreate钳降,后于Application.onAttach
-
接著就是ActivityThread.scheduleLaunchActivity
發(fā)送一個(gè)H_Launch_Activity的msg個(gè)handler
接收到msg后厚宰,就開(kāi)始了Activity的啟動(dòng)流程
http://www.reibang.com/p/a13e3a3259f3ActivityThread.handleLauchActivity---封裝
ActivityThread.performLaunchActivity---重點(diǎn)干了以下三件事
1.Instrument.newActivity
2.Activity.attach這里完成了theme主題的設(shè)置,window的初始化遂填,windowManager的配置
Activity铲觉、View、Window的理解一篇文章就夠了
http://www.reibang.com/p/5297e307a6883.執(zhí)行activity的生命周期
Activity的onCreate方法里有setContentView吓坚,交給PhoneWindow.initDecorView,并解析xml布局
Android應(yīng)用setContentView與LayoutInflater加載解析機(jī)制源碼分析
https://blog.csdn.net/yanbober/article/details/45970721Activity的onStart沒(méi)做啥事,此時(shí)已經(jīng)可見(jiàn)(只是看不見(jiàn)具體view)
Activity的onResume撵幽,把decor加到window里,并設(shè)置可見(jiàn)
接著就是View的繪制相關(guān)知識(shí)了view繪制流程就看這個(gè)源碼分析
http://www.reibang.com/p/28de1361590cView的onMesure計(jì)算大小礁击,重點(diǎn)關(guān)注 父布局測(cè)量規(guī)格對(duì)子view的影響盐杂,exactly和at_most兩種測(cè)量模式對(duì)子view layoutParams的影響
View的OnLayout計(jì)算位置,setFrame拿左右頂?shù)姿膫€(gè)坐標(biāo)確定位置
View的繪制哆窿,依次畫(huà)背景drawBackground链烈,畫(huà)自己onDraw,畫(huà)孩子dispatchDraw挚躯,畫(huà)裝飾onDrawScroll
-
View的事件分發(fā)强衡,自上而下分發(fā) ,自下而上消費(fèi)
view事件分發(fā)
http://www.reibang.com/p/66a80ff0133b
https://mp.weixin.qq.com/s/0HB719Iuz_BfGWCOIxC__A
https://mp.weixin.qq.com/s/fBeeiTgWxn6xrnTe5jVqNQ- dispatchTouchEvent默認(rèn)分發(fā)码荔,true不分發(fā)
- onInterceptTouchEvent漩勤,只有viewGroup有感挥,true攔截
- onTouchEvent,消費(fèi)事件越败,true消費(fèi)
參考鏈接
application啟動(dòng)流程
http://www.reibang.com/p/6885b4558ba2
https://mp.weixin.qq.com/s/6tEBj9b-Uuw7vT39infiAA
延展閱讀
垂直同步16ms的問(wèn)題
http://www.reibang.com/p/02800806356c