知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷(xiāo)的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷(xiāo)工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
Android性能優(yōu)化—App啟動(dòng)速度優(yōu)化
發(fā)表時(shí)間:2020-10-17
發(fā)布人:葵宇科技
瀏覽次數(shù):64
app啟動(dòng)的白屏黑屏
開(kāi)發(fā)中會(huì)在Activity的onCreate()方法中調(diào)用setContentView(View)設(shè)置該Activity的布局,那么問(wèn)題就來(lái)了,既然我們?cè)O(shè)置了布局,為什么啟動(dòng)的時(shí)候還會(huì)白屏或者黑屏而不是顯示set的布局呢?下面就一起來(lái)剖析一下原因。
當(dāng)打開(kāi)一個(gè)Activity時(shí),如果這個(gè)Activity所屬的Application還沒(méi)有在運(yùn)行,系統(tǒng)會(huì)為這個(gè)Activity的創(chuàng)建一個(gè)進(jìn)程(每開(kāi)啟一個(gè)進(jìn)程都會(huì)有一個(gè)Application,所以Application的onCreate()可能會(huì)被調(diào)用多次,一個(gè)進(jìn)程調(diào)用一次),但進(jìn)程的創(chuàng)建與初始化都需要時(shí)間,在這個(gè)動(dòng)作完成之前,如果初始化的時(shí)間過(guò)長(zhǎng),屏幕上可能沒(méi)有任何動(dòng)靜,用戶會(huì)以為沒(méi)有點(diǎn)到按鈕。所以既不能停在原來(lái)的地方又沒(méi)到顯示新的界面,怎么辦呢?這就有了StartingWindow(也稱(chēng)之為PreviewWindow)的出現(xiàn),這樣看起來(lái)就像Activity已經(jīng)啟動(dòng)起來(lái)了,只是數(shù)據(jù)內(nèi)容還沒(méi)有初始化好。
源碼:
啟動(dòng)根Activity時(shí):ActivityStack#startActivityLocked -> showStartingWindow
StartingWindow一般出現(xiàn)在應(yīng)用程序進(jìn)程創(chuàng)建并初始化成功前,所以它是個(gè)臨時(shí)窗口,對(duì)應(yīng)的WindowType是TYPE_APPLICATION_STARTING。目的是告訴用戶,系統(tǒng)已經(jīng)接受到操作,正在響應(yīng),在程序初始化完成后實(shí)現(xiàn)目的UI,同時(shí)移除這個(gè)窗口。
這個(gè)StartingWindow就是白屏黑屏的根本原因,一般情況下開(kāi)發(fā)者會(huì)對(duì)Application和Activity設(shè)置Theme,系統(tǒng)會(huì)根據(jù)設(shè)置的Theme初始化StartingWindow。Window里面的頂層是DecorView,StartingWindow顯示一個(gè)空DecorView,但是會(huì)給這個(gè)DecorView應(yīng)用這個(gè)Activity指定的Theme,如果這個(gè)Activity沒(méi)有指定Theme就用Application的(Application是系統(tǒng)要求必須設(shè)置Theme)。
在Theme中可以指定窗口的背景,Activity的ICON,APP整體文字顏色等,如果說(shuō)沒(méi)有指定任何屬性,就會(huì)用默認(rèn)的屬性,也就是上文中提到的空DecorView,所以我們的白屏和黑屏和空DecorView息息相關(guān),我們給APP設(shè)置的Style就決定了是白屏還是黑屏。
1、如果選擇了Black的系列的主題那么Activity跳轉(zhuǎn)的時(shí)候就是黑屏:
@android:style/Theme.Black"
2、如果選擇了Light的系列的主題那么Activity跳轉(zhuǎn)的時(shí)候就是白屏:
@android:style/Theme.Light"
解決辦法
方法1.設(shè)置背景圖Theme
通過(guò)設(shè)置一張背景圖。 當(dāng)程序啟動(dòng)時(shí),首先顯示這張背景圖,避免出現(xiàn)黑屏
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:screenOrientation">portrait</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">>@mipmap/splash</item>
<item name="android:windowIsTranslucent">true</item>
</style>
方法2.設(shè)置透明Theme
通過(guò)把樣式設(shè)置為透明,程序啟動(dòng)后不會(huì)黑屏而是整個(gè)透明了,等到界面初始化完才一次性顯示出來(lái)
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:screenOrientation">portrait</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
</style>
兩者對(duì)比:
第一種:程序啟動(dòng)快,界面先顯示背景圖,然后再刷新其他界面控件。但如果背景圖和要顯示的頁(yè)面風(fēng)格區(qū)別大的話會(huì)給用戶刷新不同步感覺(jué)。
第二種:用戶點(diǎn)擊我們APP圖標(biāo)后,需要等待2秒左右的時(shí)候才會(huì)顯示contentView。給用戶一種APP啟動(dòng)速度慢的假象,其實(shí)Activity已經(jīng)啟動(dòng)了,只是background是透明的,這時(shí)候你點(diǎn)擊桌面的其他地方是無(wú)效的。
方法3.去除PreviewWindow
<style name="AppStarTheme" parent="AppTheme">
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@null</item>
<item name="android:windowDisablePreview">true</item>
</style>
會(huì)造成用戶點(diǎn)擊桌面上的app圖標(biāo)后誤以為沒(méi)有點(diǎn)擊的感覺(jué)
相關(guān)案例查看更多
相關(guān)閱讀
- 海南小程序制作公司
- 日歷組件
- 小程序開(kāi)發(fā)費(fèi)用
- 軟件開(kāi)發(fā)
- 小程序表單
- 昆明小程序設(shè)計(jì)
- 網(wǎng)站排名
- 網(wǎng)站建設(shè)需要多少錢(qián)
- 網(wǎng)站維護(hù)
- 迪慶小程序開(kāi)發(fā)
- web學(xué)習(xí)路線
- 云南網(wǎng)站建設(shè)首選
- 小程序用戶登錄
- 云南微信小程序開(kāi)發(fā)
- 云南網(wǎng)站建設(shè)服務(wù)公司
- 汽車(chē)拆解管理系統(tǒng)
- 云南建設(shè)廳網(wǎng)站
- php網(wǎng)站
- 汽車(chē)報(bào)廢軟件
- 云南網(wǎng)站建設(shè)開(kāi)發(fā)
- 百度快速排名
- 服務(wù)器
- 云南網(wǎng)站建設(shè)高手
- 云南小程序設(shè)計(jì)
- web開(kāi)發(fā)技術(shù)
- 搜索排名
- 云南網(wǎng)站建設(shè)公司地址
- 開(kāi)發(fā)框架
- 云南網(wǎng)站建設(shè)靠譜公司
- 昆明做網(wǎng)站