遇到的坑
按官方文檔設(shè)置完之后官还,debug運行芹橡,或者直接點擊Run運行,閃屏頁的logo不顯示望伦,清掉后臺林说,從桌面點擊啟動logo才顯示,不過設(shè)置的windowBackgroud 都是顯示正常的屯伞,這個問題我調(diào)了一天腿箩,,劣摇,AndroidStudio版本4.2.2
如果您之前在 Android 11 或更低版本中實現(xiàn)了自定義初始屏幕珠移,則需要將您的應(yīng)用遷移到 SplashScreen
API 以確保它在 Android 12 及更高版本中正確顯示。
從 Android 12 開始末融,系統(tǒng)始終在所有應(yīng)用的 冷啟動和 熱啟動時應(yīng)用新的Android 系統(tǒng)默認(rèn)啟動畫面钧惧。默認(rèn)情況下,此系統(tǒng)默認(rèn)啟動畫面是使用您的應(yīng)用程序的啟動器圖標(biāo)元素和 您的主題(如果它是單色)構(gòu)建的勾习。windowBackground
如果您不遷移您的應(yīng)用垢乙,您在 Android 12 及更高版本上的應(yīng)用啟動體驗將會降級或可能出現(xiàn)意外結(jié)果:
- 如果您現(xiàn)有的初始屏幕是使用覆蓋 的自定義主題
android:windowBackground
實現(xiàn)的,則系統(tǒng)會將您的自定義初始屏幕替換為 Android 12 及更高版本上的默認(rèn) Android 系統(tǒng)初始屏幕(這可能不是您應(yīng)用的預(yù)期體驗)语卤。 - 如果您現(xiàn)有的初始屏幕是使用專用的 實現(xiàn)的,則
Activity
在運行 Android 12 或更高版本的設(shè)備上啟動您的應(yīng)用會導(dǎo)致重復(fù)的初始屏幕:顯示新的系統(tǒng)初始屏幕 ,然后是您現(xiàn)有的初始屏幕活動粹舵。
您可以通過完成本指南中描述的遷移過程來防止這些降級或意外體驗钮孵。遷移后,新 API 會縮短啟動時間眼滤,讓您完全控制初始屏幕體驗巴席,并確保與平臺上其他應(yīng)用程序的啟動體驗更加一致。
SplashScreen 兼容庫
您可以SplashScreen
直接使用 API诅需,但我們強(qiáng)烈建議使用 AndroidxSplashScreen
兼容庫 漾唉。compat 庫使用SplashScreen
API,支持向后兼容堰塌,并為所有 Android 版本的初始屏幕顯示創(chuàng)建一致的外觀赵刑。本指南是使用 compat 庫編寫的。
如果您選擇直接使用 SplashScreen API 進(jìn)行遷移场刑,在 Android 11 上并降低您的初始屏幕看起來與以前完全相同般此;從 Android 12 開始,初始屏幕將具有新的 Android 12 外觀牵现。
遷移您的啟動畫面實施
完成以下步驟铐懊,將您現(xiàn)有的初始屏幕實施遷移到適用于 Android 12 及更高版本的新體驗。
此過程適用于您從中遷移的任何類型的實現(xiàn)瞎疼。如果您是從專用遷移Activity
科乎,您還應(yīng)該遵循本文檔中描述的最佳實踐來調(diào)整您的自定義啟動屏幕Activity
。新的SplashScreen
API 還減少了由專用啟動屏幕活動引入的啟動延遲贼急。
使用SplashScreen
compat 庫遷移后茅茂,系統(tǒng)會在所有版本的 Android 上顯示相同的初始屏幕。
要遷移初始屏幕:
-
在
build.gradle
文件中竿裂,更改您的 compileSdkVersion并將SplashScreen
compat 庫包含在依賴項中玉吁。build.gradle android { compileSdkVersion 31 ... } dependencies { ... implementation 'androidx.core:core-splashscreen:1.0.0-beta02' }
-
使用 的父項創(chuàng)建一個主題
Theme.SplashScreen
,并將 的值設(shè)置為 應(yīng)該使用postSplashScreenTheme
的主題以及可繪制或動畫可繪制的主題腻异。其他屬性是可選的进副。Activity``windowSplashScreenAnimatedIcon
<style name="Theme.App.Starting" parent="Theme.SplashScreen"> <!-- Set the splash screen background, animated icon, and animation duration. --> <item name="windowSplashScreenBackground">@color/...</item> <!-- Use windowSplashScreenAnimatedIcon to add either a drawable or an animated drawable. One of these is required. --> <item name="windowSplashScreenAnimatedIcon">@drawable/...</item> <!-- Required for animated icons --> <item name="windowSplashScreenAnimationDuration">200</item> <!-- Set the theme of the Activity that directly follows your splash screen. --> <!-- Required --> <item name="postSplashScreenTheme">@style/Theme.App</item> </style>
如果要在圖標(biāo)下方添加背景顏色,可以使用 Theme.SplashScreen.IconBackground
主題并設(shè)置 windowSplashScreenIconBackground
屬性悔常。
-
在清單中影斑,將啟動活動的主題替換為您在上一步中創(chuàng)建的主題。
<manifest> <application android:theme="@style/Theme.App.Starting"> <!-- or --> <activity android:theme="@style/Theme.App.Starting"> ...
-
installSplashScreen
在調(diào)用之前調(diào)用啟動 活動super.onCreate()
机打。class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { // Handle the splash screen transition. val splashScreen = installSplashScreen() super.onCreate(savedInstanceState) setContentView(R.layout.main_activity) ...
installSplashScreen
返回初始屏幕對象矫户,您可以選擇使用它來自定義動畫或?qū)⒊跏计聊槐3衷谄聊簧细L的時間。有關(guān)自定義動畫的更多詳細(xì)信息残邀,請參閱 讓初始屏幕在屏幕上停留更長時間 和自定義動畫以關(guān)閉初始屏幕皆辽。
使您的自定義啟動屏幕活動適應(yīng)新的啟動屏幕體驗
在您遷移到適用于 Android 12 及更高版本的新初始屏幕體驗后柑蛇,您的自定義初始屏幕Activity
仍然存在,因此您需要選擇如何處理它驱闷。您有以下選擇:
- 保留自定義活動耻台,但阻止其顯示
- 出于品牌原因保留自定義活動
- 刪除自定義活動,并根據(jù)需要調(diào)整您的應(yīng)用程序
阻止自定義 Activity 顯示
如果您現(xiàn)有的初始屏幕Activity
主要用于路由空另,請考慮刪除它的方法盆耽;例如,您可以直接鏈接到實際活動或移動到帶有子組件的單個活動扼菠。如果這不可行摄杂,您可以使用SplashScreen#setKeepOnScreenCondition
將路由活動保持在原位,但停止渲染循榆。這樣做會將初始屏幕轉(zhuǎn)移到下一個活動析恢,并允許平滑過渡。
class RoutingActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
val splashScreen = installSplashScreen()
super.onCreate(savedInstanceState)
// Keep the splash screen visible for this Activity
splashScreen.setKeepOnScreenCondition { true }
startSomeNextActivity()
finish()
}
...
保留品牌化的自定義活動
如果您想使用后續(xù)啟動畫面Activity
來獲得品牌體驗冯痢,您可以Activity
通過自定義關(guān)閉啟動畫面的動畫氮昧,從系統(tǒng)啟動畫面過渡到您的自定義啟動畫面。但是浦楣,如果可能的話袖肥,最好避免這種情況,并使用新的 SplashScreen
API 來標(biāo)記您的啟動畫面振劳。
移除自定義閃屏Activity
一般來說椎组,我們建議您Activity
完全刪除您自定義的啟動畫面,以避免重復(fù)啟動畫面無法遷移历恐,提高效率并減少啟動畫面加載時間寸癌。您可以使用不同的技術(shù)來避免顯示多余的閃屏活動。
- 延遲加載組件弱贼、模塊或庫:避免加載或初始化應(yīng)用程序啟動時不需要的組件或庫蒸苇,并在應(yīng)用程序需要時加載它們。
如果您的應(yīng)用確實需要某個組件才能正常工作吮旅,請僅在真正需要時而不是在啟動時加載它溪烤,或者在應(yīng)用啟動后使用后臺線程加載它。盡量保持你Application onCreate()
的輕盈庇勃。
您還可以受益于使用App Startup 庫在應(yīng)用程序啟動時初始化組件檬嘀。這樣做時,請確保仍然加載啟動活動所需的所有模塊责嚷,并且不要在延遲加載的模塊變得可用時引入卡頓鸳兽。
在本地加載少量數(shù)據(jù)時創(chuàng)建占位符:使用推薦的主題化方法并保留渲染,直到應(yīng)用程序準(zhǔn)備好罕拂。要實現(xiàn)向后兼容的初始屏幕揍异,請按照使初始屏幕在屏幕上停留更長時間中概述的步驟全陨。
顯示占位符:對于持續(xù)時間不確定的基于網(wǎng)絡(luò)的加載,關(guān)閉初始屏幕并顯示占位符以進(jìn)行異步加載蒿秦】靖洌考慮將微妙的動畫應(yīng)用于反映加載狀態(tài)的內(nèi)容區(qū)域。確保加載的內(nèi)容結(jié)構(gòu) 盡可能匹配骨架結(jié)構(gòu)棍鳖,以便在加載內(nèi)容后實現(xiàn)平滑過渡。
使用緩存:當(dāng)用戶第一次打開您的應(yīng)用程序時碗旅,您可以顯示某些 UI 元素的加載指示符(如下例所示)渡处。下次用戶返回您的應(yīng)用時,您可以在加載更新的內(nèi)容時顯示此緩存內(nèi)容祟辟。
作者:一杯涼白開
鏈接:https://juejin.cn/post/7141215994197835789