将现有的启动画面实现迁移到 Android 12 及更高版本

如果您之前已经在 Android 11 或更低版本中实现自定义启动画面,则需要将您的应用迁移到 SplashScreen API,以确保它会在 Android 12 及更高版本中正确显示。

从 Android 12 开始,在所有应用的冷启动温启动期间,系统一律会应用 Android 系统的默认启动画面。默认情况下,此系统默认启动画面由应用的启动器图标元素和主题的 windowBackground(如果是单色)构成。

如果您不迁移自己的应用,那么该应用在 Android 12 及更高版本上的启动体验将会降级,也可能会产生意外结果:

  • 如果您的现有启动画面是使用替换 android:windowBackground 的自定义主题实现的,那么在 Android 12 及更高版本上,系统会将自定义启动画面替换为默认的 Android 系统启动画面(这可能不是应用的预期体验)。

  • 如果您的现有启动画面是使用专用 Activity 实现的,那么在搭载 Android 12 或更高版本的设备上启动您的应用会导致系统重复显示启动画面,也就是先显示新的系统启动画面,接着显示您现有的启动画面 activity。

您只需完成本指南中介绍的迁移流程,便可避免此类降级或意外体验。迁移后,新版 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 还可以缩短专用启动画面 activity 导致的启动延迟时间。

在您使用 SplashScreen compat 库迁移后,系统会在所有版本的 Android 平台上显示相同的启动画面。

迁移启动画面

  1. build.gradle 文件中,更改您的 compileSdkVersion,并在依赖项中添加 SplashScreen compat 库。

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-alpha01'
    }
    
  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>
       <item name="windowSplashScreenAnimationDuration">200</item>  # Required for
                                                                    # animated icons
    
       // Set the theme of the Activity that directly follows your splash screen.
       <item name="postSplashScreenTheme">@style/Theme.App</item>  # Required.
    </style>
    
  3. 在清单中,将启动 activity 的主题替换为您在上一步创建的主题。

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. 在启动 activity 中,先调用 installSplashScreen,然后再调用 setContentView

    Kotlin

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

    Java

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

installSplashScreen 会返回启动画面对象,您可以根据需要使用该对象自定义动画,或让启动画面在屏幕上显示更长时间。如需详细了解如何自定义动画,请参阅让启动画面在屏幕上显示更长时间自定义用于关闭启动画面的动画

根据新的启动画面体验调整自定义启动画面 activity

当您迁移到 Android 12 及更高版本适用的新启动画面体验后,您的自定义启动画面 Activity 也会留下来,因此您需要选择如何处理它。您可以:

  • 保留自定义 activity,但不让它显示
  • 出于品牌推广原因保留自定义 activity
  • 移除自定义 activity,然后根据需要来调整您的应用

阻止自定义 activity 显示

如果您的现有启动画面 Activity 主要用于路由,请设法移除它;例如,您可以直接链接到实际 activity,或转到含有子组件的单个 activity。如果行不通的话,您可以使用预绘制监听器来保留路由 activity,但阻止它呈现。这样做会将启动画面转移到下一个 activity,实现平稳过渡。

出于品牌推广原因保留自定义 activity

如果您想使用后续启动画面 Activity 进行品牌推广,则可以通过自定义用于关闭启动画面的动画,从系统启动画面转换到自定义启动画面 Activity。不过,最好还是尽可能避免这种情况,并使用新的 SplashScreen API 在启动画面中添加品牌信息。

移除自定义启动画面 activity

通常,我们建议您完全移除自定义启动画面 Activity,以免因不迁移而出现重复的启动画面,从而提高效率,并缩短启动画面加载时间。您可以使用以下不同的方法来避免显示多余的启动画面 activity。

  • 延迟加载组件、模块或库:避免加载或初始化应用在启动时不需要的组件或库,在应用需要时再进行加载。

    如果您的应用确实需要某个组件才能正常运行,那么请仅在真正需要的时候才加载,而不要在启动时加载,或者在应用启动后使用后台线程进行加载。请尽量让您的 Application onCreate() 轻装上阵。

    您也可以利用 App Startup 库在应用启动时初始化组件。这样做时,请确保仍会加载启动 activity 所必需的所有模块,并且不要在延迟加载的模块可用时出现卡顿问题。

  • 在本地加载少量数据时创建占位符:使用推荐的主题方法,并在应用准备就绪之前暂不显示。如需实现向后兼容的启动画面,请按照让启动画面在屏幕上显示更长时间中列出的步骤操作。

  • 显示占位符:对于基于网络且持续时间无法确定的加载任务,请关闭启动画面并显示异步加载的占位符。考虑在内容区域应用巧妙的动画效果来反映加载状态。务必让所加载内容的结构与框架结构尽可能保持一致,以便在内容加载后顺利过渡。

  • 使用缓存:当用户首次打开您的应用时,您可以显示某些界面元素的加载指示标志(如下例所示)。当用户下次返回您的应用时,您可以在加载较近内容时显示这个缓存内容。

    图 1:显示界面占位符