將啟動畫面實作遷移至 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 的外觀和風格。

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

遷移啟動畫面實作

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

這項程序適用於從任何類型的實作進行遷移。如果要從專屬 Activity 進行遷移,請遵循本文件所述的最佳做法,以調整自訂啟動畫面 ActivitySplashScreen API 也會縮短透過專屬啟動畫面活動帶來的啟動延遲時間。

如要遷移啟動畫面,請按照下列步驟操作:

  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 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. This is 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 預留位置。