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

如果您在 Android 11 或更低版本中实现自定义启动画面,请迁移您的 应用迁移到 SplashScreen API 以获取帮助 确保其在 Android 12 及更高版本中正确显示。

从 Android 12 开始,系统会应用Android 系统默认启动画面 屏幕 温 启动。默认情况下 该系统启动画面是使用应用的启动器图标元素构建的 以及您的windowBackground 主题(如果它是单色)。

如果您不迁移应用,则 Android 12 和 Android 12 上的应用启动体验会受到影响 可能会降级,或出现意外结果。

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

  • 如果现有的启动画面是使用专用 Activity 实现的, 在搭载 Android 12 或更高版本的设备上启动应用会导致 重复的启动画面: 系统启动画面 ,后跟您现有的启动画面 activity。

如要避免这类降级或意外体验,您可以完成 迁移过程。迁移完成后,该 API 缩短启动时间,让您完全掌控启动画面体验, 还能打造与平台上其他应用更加一致的启动体验。

SplashScreen compat 库

您可以直接使用 SplashScreen API,但我们强烈建议您改用 Androidx SplashScreen compat 库。该 compat 库使用 SplashScreen API,能够向后兼容,并可在所有 Android 版本上显示外观和风格一致的启动画面。本文档是使用兼容型 库。

如果您在 Android 11 及更低版本中直接使用 SplashScreen API 进行迁移 启动画面看起来与迁移前完全相同。开始日期 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. 在清单中,将启动 activity 的主题替换为您所需的主题。 创建 Deployment

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. 在启动 activity 中,先调用 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 会返回启动画面对象,您可以选择 用于自定义动画或让启动画面在屏幕上显示更长时间 时长。如需详细了解如何自定义动画,请参阅 让启动画面在屏幕上显示更长时间自定义用于关闭启动画面的动画

根据启动画面调整自定义启动画面 activity

迁移到 Android 12 及更高版本的启动画面后,您需要决定 与之前的自定义启动画面 Activity 执行的操作相同。您具有以下权限: 选项:

  • 保留自定义 activity,但阻止其显示。
  • 出于品牌推广原因保留自定义 activity。
  • 移除该自定义 activity 并根据需要调整应用。

禁止显示自定义 activity

如果之前的启动画面 Activity 主要用于路由, 请考虑将其移除例如,您可以直接链接到 activity 或移至具有子组件的单个 activity。如果 可行,可以使用 SplashScreen.setKeepOnScreenCondition 将路由 activity 保留到位,但使其停止渲染。执行此操作 将启动画面传输到下一个 activity,并支持流畅 过渡效果。

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 来宣传品牌,请执行以下操作: 可以从系统启动画面转换到自定义启动画面 通过自定义用于关闭启动画面的动画来实现 Activity 屏幕。 不过,最好尽可能避免这种情况,并使用 SplashScreen 通过 API 为启动画面添加品牌信息。

如果您需要显示对话框, 建议在后续的自定义启动画面 activity 上展示它,或者 在主 activity 之上。

移除自定义启动画面 activity

通常,我们建议您移除之前的自定义启动画面 Activity 这样既能避免重复的启动画面,又能提高效率 并缩短启动画面加载时间。有多种方法可以 来避免显示多余的启动画面 activity。

  • 对组件、模块或库使用延迟加载。避免加载 或者初始化应用 。稍后在应用需要时加载它们。

    如果您的应用确实需要某个组件才能正常运行,请仅在该组件 而无需在启动时就已启动,也可使用后台线程加载 。请尽量让您的 Application.onCreate() 轻装上阵。

    您还可以使用 App Startup 库,用于初始化组件 。执行此操作时,请确保仍然加载所有 启动 activity 所需的模块,并且不会在 延迟加载的模块可供使用

  • 在本地加载少量数据时创建占位符。使用 建议采用主题方法,并等到应用完成 就绪。如需实现向后兼容的启动画面,请遵循 概述的 让启动画面在屏幕上显示更长时间

  • 显示占位符。对于持续时间不确定的基于网络的负载: 关闭启动画面并显示异步加载的占位符。 考虑在内容区域应用巧妙的动画效果来反映加载状态。请确保加载的内容结构与 骨架结构 以便在加载内容时实现平稳过渡。

  • 使用缓存。当用户首次打开您的应用时,您可以展示 加载指示器,如下图所示。通过 当用户下次返回您的应用时,您可以在 加载更新的内容。

。 <ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
图 1.目前显示的是界面占位符。