將現有啟動畫面的實作架構遷移至 Android 12 以上版本

如果您先前已在 Android 11 以下版本中實作了自訂啟動畫面,就必須將應用程式遷移至 SplashScreen API,以確保其可在 Android 12 以上版本中正確顯示。

從 Android 12 開始,系統會一律為所有應用程式在冷啟動暖啟動時套用新的 Android 系統預設啟動畫面。根據預設,此系統預設啟動畫面是使用應用程式的啟動器圖示元素和主題的 windowBackground (如果是單一顏色) 建構而成。

如果您未能遷移應用程式,當使用者在 Android 12 以上版本的裝置上啟動應用程式時,會發現啟動效果比較遜色,甚至會出現一些意外情況:

  • 如果您是使用覆寫 android:windowBackground 的自訂主題實作現有啟動畫面,則 Android 12 以上版本會將您的自訂啟動畫面替換成 Android 系統預設啟動畫面,而這可能不是應用程式意圖呈現的效果。

  • 如果您是使用專屬 Activity 實作現有啟動畫面,則在搭載 Android 12 以上版本的裝置上啟動應用程式會產生重複的啟動畫面,也就是先顯示新的系統啟動畫面,然後再顯示現有的啟動畫面活動。

完成本指南所述的遷移程序,即可避免效果降級或非預期的體驗。完成遷移後,新的 API 可以縮短啟動時間、讓您完整掌控啟動畫面體驗,並且確保提供與平台上其他應用程式更加一致的啟動體驗。

SplashScreen Compat 程式庫

您可以直接使用 SplashScreen API,但我們強烈建議改用 Androidx SplashScreen Compat 程式庫。Compat 程式庫使用 SplashScreen API,支援回溯相容性,並在所有 Android 版本上顯示外觀和風格一致的啟動畫面螢幕。本指南使用 Compat 程式庫編寫。

如果您選擇直接使用 SplashScreen API 進行遷移,則在 Android 11 以下版本,啟動畫面的外觀會維持不變;而從 Android 12 開始,啟動畫面將具有全新的 Android 12 外觀和風格。

遷移啟動畫面實作

如要將現有啟動畫面實作遷移至 Android 12 及以上版本的新體驗,請完成下列步驟。

這個程序適用於從任何類型的實作進行遷移。如果要從專屬 Activity 進行遷移,您應同時遵循本文件所述的最佳做法,以調整您的自訂啟動畫面 Activity。新 SplashScreen API 還能縮短因專用啟動畫面活動而帶來的啟動延遲。

使用 SplashScreen Compat 程式庫遷移後,系統會在所有 Android 版本上顯示相同的啟動畫面。

如何遷移啟動畫面:

  1. build.gradle 檔案中,變更您的 compileSdkVersion,並在依附元件中加入 SplashScreen Compat 程式庫。

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta02'
    }
    
  2. 建立具有 Theme.SplashScreen 父項的主題,並將 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>
    

    如要在圖示下方新增背景顏色,可以使用 Theme.SplashScreen.IconBackground 主題並設定 windowSplashScreenIconBackground 屬性。

  3. 在資訊清單中,將起始活動的主題替換成您在上一個步驟中建立的主題。

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. 請先在起始活動中呼叫 installSplashScreen,再呼叫 super.onCreate()

    Kotlin

    class MainActivity : Activity() {
    
       override fun onCreate(savedInstanceState: Bundle?) {
           // Handle the splash screen transition.
           val splashScreen = installSplashScreen()
    
           super.onCreate(savedInstanceState)
           setContentView(R.layout.main_activity)
    ...
    

    Java

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
             // Handle the splash screen transition.
             SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
    
             super.onCreate(savedInstanceState);
             setContentView(R.layout.main_activity);
        }
    }
    

installSplashScreen 會傳回啟動畫面物件,讓您能夠視需要用來自訂動畫,或者延長啟動畫面在螢幕上停留的時間。如要進一步瞭解如何自訂動畫,請參閱延長啟動畫面在螢幕上的停留時間自訂用於關閉啟動畫面的動畫相關說明。

調整自訂啟動畫面活動以享受新的啟動畫面體驗

遷移至 Android 12 以上版本的全新啟動畫面體驗後,自訂啟動畫面 Activity 仍會保持原狀,因此您必須選擇處理方式。您可以採取下列做法︰

  • 保留自訂活動,但阻止其顯示
  • 基於品牌宣傳考量保留自訂活動
  • 移除自訂活動,並視需要調整應用程式

阻止顯示自訂活動

如果現有啟動畫面 Activity 主要用於轉送作業,請考慮加以移除的方式;例如,您可以直接連結至實際活動,或改用含有子元件的單一活動。如果這些方法都不可行,則可以使用 SplashScreen#setKeepOnScreenCondition 來保留轉送活動,但停止顯示畫面。這樣做可將啟動畫面轉移至下一個活動,以便順利轉換畫面。

Kotlin

  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()
     }
   ...
  

Java

  public class RoutingActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      SplashScreen splashScreen = SplashScreen.installSplashScreen(this);

       super.onCreate(savedInstanceState);

       // Keep the splash screen visible for this Activity
       splashScreen.setKeepOnScreenCondition(() -> true );
       startSomeNextActivity();
       finish();
    }
  ...
  

保留自訂活動用於品牌宣傳

如果您想使用後續啟動畫面 Activity 來進行品牌宣傳,則可以自訂用於關閉啟動畫面的動畫,從系統啟動畫面轉換至自訂啟動畫面 Activity。不過,建議您盡量避免使用上述做法,並使用新的 SplashScreen API 來為啟動畫面新增品牌宣傳元素。

移除自訂啟動畫面活動

一般來說,我們建議完全移除自訂啟動畫面 Activity,以避免因未進行遷移而重複顯示啟動畫面,同時提高效率並縮短啟動畫面的載入時間。您可以使用各種不同技巧,避免顯示多餘的啟動畫面活動。

  • 延遲載入元件、模組或程式庫:避免在啟動時載入或初始化應用程式運作時不需要的元件或程式庫,在之後需要時再載入。

    如果應用程式確實需要特定元件才能正確運作,則僅在確實需要時才將它載入,而不要在啟動時載入,或者在應用程式啟動後,使用背景執行緒進行載入。保持 Application onCreate() 盡可能精簡。

    您也可以利用 App Startup 程式庫,在應用程式啟動時初始化元件。如要這樣做,請務必仍要載入啟動活動的所有必要模組,並避免在提供延遲載入的模組時出現卡頓情形。

  • 在本機載入少量資料時建立預留位置:使用建議的主題設定方法,並在應用程式準備就緒前暫停算繪作業。如要實作具回溯相容性的啟動畫面,請按照「延長啟動畫面在螢幕上的停留時間」所述的步驟操作。

  • 顯示預留位置:如果是透過持續時間不確定的網路進行載入作業,請關閉啟動畫面並顯示用於非同步載入的預留位置。考慮在內容區域應用巧妙的動畫來反應載入狀態。請確定載入的內容結構盡可能符合架構結構,以便在內容載入後順利進行轉換。

  • 使用快取:使用者首次開啟應用程式時,您可顯示某些 UI 元素的載入指標 (如以下範例中所示)。使用者下次返回應用程式時,您可以在載入更多新內容的同時時顯示此快取內容。

    圖 1:顯示 UI 預留位置