欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

Android性能優(yōu)化—App啟動(dòng)速度優(yōu)化 - 新聞資訊 - 云南小程序開(kāi)發(fā)|云南軟件開(kāi)發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開(kāi)發(fā)/軟件開(kāi)發(fā)

知識(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í)提供便捷的支持!

您當(dāng)前位置>首頁(yè) » 新聞資訊 » 技術(shù)分享 >

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)案例查看更多