Xamarin.Forms PCL应用Android 12及以上版本启动页失效问题
问题背景
Android 12及更高版本对Splash Screen API做出了变更,基于Xamarin.Forms开发的安卓应用已无法正常显示启动页。
目前公开可查的启动页替代实现方案均针对Xamarin.Android原生开发,不适用于Xamarin.Forms开发场景。
官方迁移文档给出的Kotlin适配示例代码如下:
val splashScreen = installSplashScreen()
C#开发环境下没有上述代码的直接等价实现,无法直接套用官方原生方案。
已尝试操作与报错
此前尝试在项目中新建名为values-v31的文件夹,在文件夹内创建styles.xml文件,写入如下XML配置:
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="Theme.App.Starting" parent="Theme.SplashScreen"> <!-- 配置启动页结束后直接加载的Activity主题 --> <!-- 为必填配置项 --> <item name="postSplashScreenTheme">@style/SplashScreen</item> </style></resources>
写入配置后项目编译阶段直接报错,报错截图如下:
测试环境信息
- Xamarin.Forms 版本:5.0.0.2478
- 目标Android API 版本:31
适配步骤
1. 引入依赖包
安装Xamarin.AndroidX.Core.SplashScreen NuGet包到Xamarin.Android项目,该包为Google官方Splash Screen库的.NET绑定实现,提供了和原生installSplashScreen()等价的C# API。之前遇到的编译报错,本质是没有引入该依赖,系统找不到Theme.SplashScreen父主题资源导致的。
2. 完善启动主题配置
保留之前创建的values-v31/styles.xml文件,在原有配置基础上补充启动页图标、背景色配置,参考如下:
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="Theme.App.Starting" parent="Theme.SplashScreen"> <!-- 启动页结束后加载的应用原有主题,替换为你项目实际使用的主题 --> <item name="postSplashScreenTheme">@style/MainTheme</item> <!-- 启动页中心图标,替换为你的应用启动图标资源 --> <item name="windowSplashScreenAnimatedIcon">@mipmap/launcher_foreground</item> <!-- 启动页背景色,替换为你需要的背景色值 --> <item name="windowSplashScreenBackground">@color/launcher_bg</item> </style> </resources>
注意:
postSplashScreenTheme必须填写应用正常运行时使用的主题,不要和启动主题混淆,否则会出现样式异常。
3. 修改MainActivity代码
在MainActivity的OnCreate方法最开头,也就是base.OnCreate(savedInstanceState)调用之前,添加启动页安装代码,示例如下:
using AndroidX.Core.SplashScreen; // 其他using引用保留 [Activity( Label = "你的应用名称", Icon = "@mipmap/icon", Theme = "@style/Theme.App.Starting", // 将Activity主题设置为刚才定义的启动主题 MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)] public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { protected override void OnCreate(Bundle savedInstanceState) { // 安装启动页,必须在base.OnCreate之前调用 SplashScreen.InstallSplashScreen(this); base.OnCreate(savedInstanceState); // 原有Xamarin.Forms初始化逻辑保持不变 Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App()); } // 其他原有方法代码保持不变 }
4. 兼容验证
上述配置同时兼容Android 12及以上、Android 12以下版本系统,不需要额外做版本判断,重新编译项目即可解决启动页不显示、编译报错的问题。
内容的提问来源于stack exchange,提问作者Jivan Bhandari

