我尝试将我的应用程序升级到引入闪屏API的目标Android 31,因此我遵循了here提到的迁移过程,但迁移后应用程序无法运行,因为闪屏API仅支持Android版本21及以上,那么支持21以上的旧版本的过程是什么?
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>
50pmv0ei2#
什么对我有效,什么受@Ramy Ibrahim的启发在清单文件中<application>标记add之前
@Ramy Ibrahim
<application>
<uses-sdk tools:overrideLibrary="androidx.core.splashscreen" />
在您theme/style中
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个
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); } } }
nimxete23#
如果您使用的是Androidx Compat Library,请确保您使用的属性不带android标记。例如:这样就行了
<item name="windowSplashScreenBackground">?colorPrimary</item>
这将给予“需要API 31”错误
<item name="android:windowSplashScreenBackground">?colorPrimary</item>
3条答案
按热度按时间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-为了允许应用程序编译和构建,我必须将此行添加到清单文件中
2-按照文档中的migration步骤创建使用Androidx闪屏API的新闪屏活动。
3-在values文件夹下创建bools.xml
4-在我的例子中,覆盖values-vX(X是minSdkVersion)中的bools.xml是16,因此我在values文件夹的同一级别创建了values-v16文件夹,并在其下创建了bools.xml,如下所示
5-覆盖values-vX中的bools.xml(X是您想要应用新闪屏的最小版本,因此它是21到31之间的任何数字)
6-在您的清单中,我让系统根据bools.xml文件中的值决定启动哪个splash活动
50pmv0ei2#
什么对我有效,什么受
@Ramy Ibrahim
的启发在清单文件中
<application>
标记add之前在您
theme/style
中NewSplashActivity
个nimxete23#
如果您使用的是Androidx Compat Library,请确保您使用的属性不带android标记。例如:
这样就行了
这将给予“需要API 31”错误