本系列博文 基于是前微信高級(jí)工程師張紹文專欄 《Android開(kāi)發(fā)高手課》的讀書(shū)筆記。
文章所寫(xiě)內(nèi)容是本人讀完的感悟,需要原文的朋友請(qǐng)自行購(gòu)買(mǎi)。
啟動(dòng)優(yōu)化篇
在說(shuō)如何對(duì)啟動(dòng)時(shí)間進(jìn)行優(yōu)化之前,我們得先知道從用戶點(diǎn)擊應(yīng)用圖標(biāo)開(kāi)始,一共經(jīng)歷了那些階段。
主要階段如下圖.

T0~T1階段
這個(gè)階段是手機(jī)系統(tǒng)解析點(diǎn)擊事件,效應(yīng)快慢跟手機(jī)性能有關(guān)
T1~T2階段
系統(tǒng)在正式啟動(dòng)應(yīng)用之前,會(huì)根據(jù)應(yīng)用設(shè)置的Theme設(shè)置一個(gè)預(yù)覽界面.
應(yīng)用啟動(dòng)白屏也是發(fā)生在這里,如果你沒(méi)有設(shè)置對(duì)應(yīng)的Theme,并且Activity的onCreate函數(shù)執(zhí)行所需要的時(shí)間過(guò)長(zhǎng),就會(huì)出現(xiàn)白屏的情況.比較可行的解決方式是給啟動(dòng)頁(yè)的Theme設(shè)置一張背景圖。如下
<activity
android:name=".view.SplashActivity"
android:theme="@style/LauncherTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<style name="LauncherTheme" parent="AppTheme">
<item name="android:windowBackground">@drawable/logo_bg</item>
</style>
這樣的話,在點(diǎn)擊應(yīng)用圖標(biāo)后,就會(huì)先顯示一張背景圖,
另外還可以將預(yù)覽窗口指定為透明的,這樣用戶在看到閃屏頁(yè)之前會(huì)一直帶著桌面,但這樣就會(huì)給用戶一種點(diǎn)了很久才會(huì)看到界面的感覺(jué)。
在預(yù)覽界面顯示之后,便會(huì)創(chuàng)建Application和閃屏頁(yè),大部分應(yīng)用都會(huì)在這個(gè)時(shí)候初始化各種功能.因而導(dǎo)致
預(yù)覽界面~閃屏界面顯示 這個(gè)時(shí)間會(huì)很長(zhǎng).
如何優(yōu)化
除了必須要在Application中初始化的功能,我們可以把其他一些功能的初始化移到閃屏頁(yè)中,因?yàn)榇蠖鄶?shù)應(yīng)用的閃屏頁(yè)都會(huì)停留幾秒鐘。這里還要注意的是,移到閃屏頁(yè)初始化的功能代碼,不要放在onCreate生命周期下,而是另外開(kāi)啟一個(gè)線程來(lái)做初始化行為。
另外,多線程的切換會(huì)影響CPU的性能.所以如果你的應(yīng)用在啟動(dòng)時(shí)需要開(kāi)多個(gè)線程的話,需要考慮用線程池來(lái)維護(hù)
T2~T3階段
在閃屏頁(yè)顯示的時(shí)候,會(huì)開(kāi)始主頁(yè)視圖的繪制,這個(gè)時(shí)候需要注意,因?yàn)橹罢f(shuō)到,閃屏頁(yè)中會(huì)開(kāi)啟子線程去初始化一些功能。如果需要初始化的模塊過(guò)多,開(kāi)始加載首頁(yè)的時(shí)候還沒(méi)初始化完成,恰巧這個(gè)時(shí)候首頁(yè)又需要用到這個(gè)模塊.那這個(gè)時(shí)候就會(huì)報(bào)錯(cuò)。
所以首頁(yè)需要用到的模塊必須得在調(diào)用之前初始化成功。
T3~T4階段
首頁(yè)正常顯示了,但這個(gè)時(shí)候你不一定就能點(diǎn)擊,問(wèn)題還是在于有些功能模塊的代碼還未初始化完成。
總結(jié)
界面顯示上:
預(yù)覽窗口可以采用自由logo背景或者與閃屏頁(yè)共用,以防止白屏.
模塊初始化:
application中初始化一部分必要的模塊,閃屏頁(yè)通過(guò)子線程加載一部分模塊,剩下的非緊急的模塊用懶加載的方式,
其中懶加載要防止集中化,不然可能會(huì)出現(xiàn)一次加載太多,導(dǎo)致某個(gè)界面無(wú)法操作的情況。
張老師課中還涉及許多監(jiān)控和底層相關(guān)的東西,我個(gè)人接觸的較少,這里就不在贅述了。