API 21之前的Android 12闪屏

8e2ybdfx  于 2022-12-16  发布在  Android
关注(0)|答案(3)|浏览(196)

我尝试将我的应用程序升级到引入闪屏API的目标Android 31,因此我遵循了here提到的迁移过程,但迁移后应用程序无法运行,因为闪屏API仅支持Android版本21及以上,那么支持21以上的旧版本的过程是什么?

thtygnil

thtygnil1#

Androidx SplashScreen类的工作原理如下:
在API 31+(Android 12+)上,此类调用平台方法。
在API 31之前,平台行为被复制,但启动屏幕上的Animated Vector Drawable支持除外。
问题是Animated Vector Drawable类是在Android 21中引入的,因此当前的Androidx SplashScreen类向后兼容Android +21,因此我找到了一些解决方案。我创建了两个不同的闪屏活动,一个用于处理旧版本,另一个使用Androidx SplashScreen API。我根据当前的Android版本制作了系统午餐闪屏,因此我做了以下操作
1-为了允许应用程序编译和构建,我必须将此行添加到清单文件中

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

2-按照文档中的migration步骤创建使用Androidx闪屏API的新闪屏活动。
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(X是minSdkVersion)中的bools.xml是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是您想要应用新闪屏的最小版本,因此它是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文件中的值决定启动哪个splash活动

<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>
50pmv0ei

50pmv0ei2#

什么对我有效,什么受@Ramy Ibrahim的启发
在清单文件中<application>标记add之前

<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);
        
    }
}

}
nimxete2

nimxete23#

如果您使用的是Androidx Compat Library,请确保您使用的属性不带android标记。例如:
这样就行了

<item name="windowSplashScreenBackground">?colorPrimary</item>

这将给予“需要API 31”错误

<item name="android:windowSplashScreenBackground">?colorPrimary</item>

相关问题