Skip to main content

向您的 Android 应用添加启动画面

一个图表概述了应用程序的启动流程,包括启动画面

启动画面(也称为启动屏幕)在 Android 应用加载时提供简单的初始体验。它们为您的应用程序设置了舞台,同时允许应用程序引擎加载和应用程序初始化的时间。

概述

#

在 Android 中,您可以控制两个单独的屏幕:一个在 Android 应用初始化时显示的 启动屏幕 ,以及一个在 Flutter 体验初始化时显示的 启动画面

初始化应用

#

每个 Android 应用在操作系统设置应用进程时都需要初始化时间。Android 提供了启动屏幕的概念,以便在应用初始化时显示一个 Drawable

Drawable 是一个 Android 图形。要了解如何在 Android Studio 中将 Drawable 添加到您的 Flutter 项目中,请查看 Android 开发者文档中的将可绘制对象导入您的项目

默认的 Flutter 项目模板包含启动主题和启动背景的定义。您可以通过编辑 styles.xml 来自定义它,您可以在其中定义一个主题,其 windowBackground 设置为应显示为启动屏幕的 Drawable

xml
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
    <item name="android:windowBackground">@drawable/launch_background</item>
</style>

此外,styles.xml 定义了一个 普通主题 ,应用于启动屏幕消失后的 FlutterActivity。普通主题背景仅在启动画面消失后、方向更改和 Activity 恢复期间短暂显示。因此,建议普通主题使用与 Flutter UI 的主要背景颜色相似的纯色背景。

xml
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
    <item name="android:windowBackground">@drawable/normal_background</item>
</style>

在 AndroidManifest.xml 中设置 FlutterActivity

#

AndroidManifest.xml 中,将 FlutterActivitytheme 设置为启动主题。然后,向所需的 FlutterActivity 添加一个元数据元素,以指示 Flutter 在适当的时间从启动主题切换到普通主题。

xml
<activity
    android:name=".MyActivity"
    android:theme="@style/LaunchTheme"
    // ...
    >
    <meta-data
        android:name="io.flutter.embedding.android.NormalTheme"
        android:resource="@style/NormalTheme"
        />
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

Android 应用现在会在应用初始化时显示所需的启动屏幕。

Android 12

#

要配置 Android 12 上的启动屏幕,请查看Android 启动画面

从 Android 12 开始,您必须在 styles.xml 文件中使用新的启动画面 API。考虑为 Android 12 及更高版本创建备用资源文件。还要确保您的背景图片符合图标指南;请查看Android 启动画面以了解更多详细信息。

xml
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
    <item name="android:windowSplashScreenBackground">@color/bgColor</item>
    <item name="android:windowSplashScreenAnimatedIcon">@drawable/launch_background</item>
</style>

确保您的清单中 设置 io.flutter.embedding.android.SplashScreenDrawable,并且 实现 provideSplashScreen,因为这些 API 已弃用。这样做会导致 Android 启动屏幕在启动应用时平滑地淡入 Flutter,并且应用可能会崩溃。

有些应用可能希望继续在 Flutter 中显示 Android 启动屏幕的最后一帧。例如,这在 Dart 中继续进行其他加载时保留了单帧的错觉。为此,以下 Android API 可能会有所帮助:

MainActivity.kt
kotlin
import android.os.Build
import android.os.Bundle
import androidx.core.view.WindowCompat
import io.flutter.embedding.android.FlutterActivity

class MainActivity : FlutterActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    // 将 Flutter 视图与窗口垂直对齐。
    WindowCompat.setDecorFitsSystemWindows(getWindow(), false)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
      // 禁用 Android 启动画面淡出动画,以避免
      // 在 Flutter 中绘制类似帧之前出现闪烁。
      splashScreen.setOnExitAnimationListener { splashScreenView -> splashScreenView.remove() }
    }

    super.onCreate(savedInstanceState)
  }
}
MainActivity.java
java
import android.os.Build;
import android.os.Bundle;
import android.window.SplashScreenView;
import androidx.core.view.WindowCompat;
import io.flutter.embedding.android.FlutterActivity;

public class MainActivity extends FlutterActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 将 Flutter 视图与窗口垂直对齐。
        WindowCompat.setDecorFitsSystemWindows(getWindow(), false);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            // 禁用 Android 启动画面淡出动画,以避免
            // 在 Flutter 中绘制类似帧之前出现闪烁。
            getSplashScreen()
                .setOnExitAnimationListener(
                    (SplashScreenView splashScreenView) -> {
                        splashScreenView.remove();
                    });
        }

        super.onCreate(savedInstanceState);
    }
}

然后,您可以重新实现 Flutter 中的第一帧,该帧在屏幕上的相同位置显示 Android 启动屏幕的元素。有关此示例,请查看Android 启动画面示例应用程序