Android 12 api 21 之前的启动画面

Android 12 splash screen before api 21

我正在尝试将我的应用程序升级到目标 android 31,它引入了启动画面 API 所以我遵循了提到的迁移过程 here,但是在迁移之后应用程序没有t 运行 因为启动画面 API 仅支持 android 21 及以上版本,所以支持 21 之前的旧版本的过程是什么?

Androidx SplashScreen class 工作方式如下:

在 API 31+ (Android 12+) 这 class 调用平台方法。

API31 之前的平台行为被复制,但启动屏幕上的 Animated Vector Drawable 支持除外。

问题是 Animated Vector Drawable class 是在 Android 21 中引入的,因此当前的 Androidx SplashScreen class 向后兼容 Android +21 所以我想出了一些解决方案。 我创建了两个不同的启动画面活动,一个用于处理旧版本,另一个使用 Androidx SplashScreen API。我根据当前 android 版本制作了系统午餐闪屏,所以我做了以下

1- 为了允许应用程序编译和构建,我必须将这一行添加到我的清单文件中

<uses-sdk tools:overrideLibrary="androidx.core.splashscreen"/>

2- 按照文档中的 migration 步骤创建使用 Androidx SplashScreen API 的新启动画面 activity。

3- 在 values 文件夹下创建 bools.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="new_splash_enabled">false</bool>
    <bool name="old_splash_enabled">false</bool>
</resources>

4- 在 values-vX 中覆盖 bools.xml(X 是 minSdkVersion)在我的例子中是 16 所以我在相同级别的 values 文件夹中创建了 values-v16 文件夹并在下面创建 bools.xml如下图

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="new_splash_enabled">false</bool>
    <bool name="old_splash_enabled">true</bool>
</resources>

5- 覆盖 values-vX 中的 bools.xml(X 是您要应用新 SplashScreen 的最低版本,因此它是 21 到 31 之间的任意数字)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="new_splash_enabled">true</bool>
    <bool name="old_splash_enabled">false</bool>
</resources>

6- 在您的清单中,我让系统根据 bools.xml 文件

中的值决定启动哪个启动画面 activity
        <activity
            android:name=".NewSplash"
            android:theme="@style/Theme.App.Starting"
            android:enabled="@bool/new_splash_enabled"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".OldSplash"
            android:enabled="@bool/old_splash_enabled">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

什么对我有用,并受到 @Ramy Ibrahim 答案

的启发

在您的清单文件中,在 <application> 标记之前添加

 <uses-sdk tools:overrideLibrary="androidx.core.splashscreen" />

在你的 theme/style

<style name="ThemeStarting" parent="Theme.SplashScreen">
    <item name="windowSplashScreenBackground">@color/_background_color</item>
    <item name="windowSplashScreenAnimatedIcon">@drawable/icon</item>
    <item name="windowSplashScreenAnimationDuration">1000</item>
    <item name="postSplashScreenTheme">@style/YOUR_THEME</item>
</style>

NewSplashActivity

public class NewSplashActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(getBaseContext(), MainActivity.class);
        startActivity(intent);
        finish();
    }
    else {
        setTheme(R.style.OldSplashTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.new_spl);

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                Intent intent = new Intent(getBaseContext(), MainActivity.class);
                startActivity(intent);
                finish();
            }
        }, 1999);
    }

}


@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
            getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        
    }
}

}