Android 閃屏頁適配

遇到的坑

按官方文檔設(shè)置完之后官还,debug運行芹橡,或者直接點擊Run運行,閃屏頁的logo不顯示望伦,清掉后臺林说,從桌面點擊啟動logo才顯示,不過設(shè)置的windowBackgroud 都是顯示正常的屯伞,這個問題我調(diào)了一天腿箩,,劣摇,AndroidStudio版本4.2.2

如果您之前在 Android 11 或更低版本中實現(xiàn)了自定義初始屏幕珠移,則需要將您的應(yīng)用遷移到 SplashScreenAPI 以確保它在 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 庫使用SplashScreenAPI,支持向后兼容堰塌,并為所有 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。新的SplashScreenAPI 還減少了由專用啟動屏幕活動引入的啟動延遲贼急。

使用SplashScreencompat 庫遷移后茅茂,系統(tǒng)會在所有版本的 Android 上顯示相同的初始屏幕。

要遷移初始屏幕:

  1. build.gradle文件中竿裂,更改您的 compileSdkVersion并將 SplashScreencompat 庫包含在依賴項中玉吁。

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta02'
    }
    
  2. 使用 的父項創(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屬性悔常。

  1. 在清單中影斑,將啟動活動的主題替換為您在上一步中創(chuàng)建的主題。

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  2. 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)啟動畫面過渡到您的自定義啟動畫面。但是浦楣,如果可能的話袖肥,最好避免這種情況,并使用新的 SplashScreenAPI 來標(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末医瘫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旧困,更是在濱河造成了極大的恐慌醇份,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吼具,死亡現(xiàn)場離奇詭異僚纷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拗盒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門怖竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陡蝇,你說我怎么就攤上這事痊臭。” “怎么了登夫?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵广匙,是天一觀的道長。 經(jīng)常有香客問我恼策,道長鸦致,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任戏蔑,我火速辦了婚禮蹋凝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘总棵。我一直安慰自己鳍寂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布情龄。 她就那樣靜靜地躺著迄汛,像睡著了一般捍壤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鞍爱,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天鹃觉,我揣著相機(jī)與錄音,去河邊找鬼睹逃。 笑死盗扇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沉填。 我是一名探鬼主播疗隶,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼翼闹!你這毒婦竟也來了斑鼻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤猎荠,失蹤者是張志新(化名)和其女友劉穎坚弱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體关摇,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡荒叶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拒垃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片停撞。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悼瓮,靈堂內(nèi)的尸體忽然破棺而出戈毒,到底是詐尸還是另有隱情,我是刑警寧澤横堡,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布埋市,位于F島的核電站,受9級特大地震影響命贴,放射性物質(zhì)發(fā)生泄漏道宅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一胸蛛、第九天 我趴在偏房一處隱蔽的房頂上張望污茵。 院中可真熱鬧,春花似錦葬项、人聲如沸泞当。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽襟士。三九已至盗飒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陋桂,已是汗流浹背逆趣。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留嗜历,地道東北人宣渗。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像秸脱,于是被迫代替她去往敵國和親落包。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容