Xamarin Forms安卓应用闲置恢复时黑白闪烁并冻结问题求助
我的Xamarin Forms安卓应用异常问题求助
问题现象
应用闲置数小时后恢复运行时,会先显示空白屏幕,随后快速黑白闪烁数秒,接着黑屏并完全冻结。未发现崩溃日志,推测问题未波及PCL层。该问题在Debug、Release版本中均会出现,涵盖包括Android 13在内的多款真机设备。
唯一可行的解决方式是关闭应用后重新打开,此时应用可正常运行。问题疑似与设备明暗主题切换+长时间闲置的组合场景相关,但手动切换主题后重启应用不会出现闪烁现象。
癫痫警示:闪烁画面可能引发不适
已尝试的排查手段
- 合并启动页与主Activity,排查页面过渡逻辑,无效
- 修改启动页逻辑,显式启动主Activity后销毁自身,无效
- 添加定时器,在应用后台运行5分钟后销毁主Activity,问题仍存在
应用核心代码与配置
启动页Activity
[Activity(MainLauncher = true, NoHistory = true)] public class SplashActivity : AppCompatActivity { protected override void OnCreate(Bundle savedInstanceState) { try { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); } catch (Exception ex) { // 尝试捕获错误 } } protected override void OnStart() { try { base.OnStart(); StartActivity(new Intent(Application.Context, typeof(MainActivity)).PutExtras(Intent)); } catch (Exception ex) { // 尝试捕获错误 } finally { Finish(); } } public override void OnBackPressed() { } }
主Activity
[Activity(Icon = "@mipmap/ic_launcher", Theme = "@style/MainTheme", MainLauncher = false, LaunchMode = LaunchMode.SingleTask, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize, ResizeableActivity = false, NoHistory = false, Exported = true)] // Auth0 意图过滤器 public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity, IOnSuccessListener { INotificationActionService _notificationActionService; IDeviceInstallationService _deviceInstallationService; INotificationActionService NotificationActionService => _notificationActionService ??= ServiceContainer.Resolve<INotificationActionService>(); IDeviceInstallationService DeviceInstallationService => _deviceInstallationService ??= ServiceContainer.Resolve<IDeviceInstallationService>(); protected override void OnCreate(Bundle savedInstanceState) { try { TabLayoutResource = Resource.Layout.Tabbar; ToolbarResource = Resource.Layout.Toolbar; base.OnCreate(savedInstanceState); Bootstrap.Begin(() => new DeviceInstallationService()); if (DeviceInstallationService.NotificationsSupported) { FirebaseMessaging.Instance.GetToken().AddOnSuccessListener(this, this); } Rg.Plugins.Popup.Popup.Init(this); Xamarin.Essentials.Platform.Init(this, savedInstanceState); CrossCurrentActivity.Current.Init(this, savedInstanceState); Forms.Init(this, savedInstanceState); InitFontScale(); CachedImageRenderer.Init(true); _ = typeof(SvgCachedImage); UserDialogs.Init(this); LoadApplication(new App()); ProcessNotificationActions(Intent); } catch (Exception ex) { // 尝试捕获错误 } } public override void OnBackPressed() => Rg.Plugins.Popup.Popup.SendBackPressed(base.OnBackPressed); public void OnSuccess(Java.Lang.Object result) => DeviceInstallationService.Token = result.ToString(); private void InitFontScale() { var configuration = Resources.Configuration; configuration.FontScale = Math.Min(1f, configuration.FontScale); // 0.85=小号, 1=标准, 1.15=大号,1.3=更大,1.45=超大 var metrics = new DisplayMetrics(); #pragma warning disable CS0618 // 类型或成员已过时 WindowManager.DefaultDisplay.GetMetrics(metrics); #pragma warning restore CS0618 // 类型或成员已过时 metrics.ScaledDensity = configuration.FontScale * metrics.Density; BaseContext.ApplicationContext.CreateConfigurationContext(configuration); BaseContext.Resources.DisplayMetrics.SetTo(metrics); } public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); } protected override void OnResume() { try { var culture = new CultureInfo("en-GB"); CultureInfo.DefaultThreadCurrentCulture = culture; Thread.CurrentThread.CurrentCulture = culture; InitFontScale(); base.OnResume(); } catch (Exception ex) { // 尝试捕获错误 } } protected override void OnNewIntent(Intent intent) { try { base.OnNewIntent(intent); Auth0.OidcClient.ActivityMediator.Instance.Send(intent.DataString); ProcessNotificationActions(intent); } catch (Exception ex) { // 尝试捕获错误 } } private void ProcessNotificationActions(Intent intent) { try { if (intent?.HasExtra("action") == true) { var bundle = intent.Extras; var dict = bundle.KeySet().ToDictionary(key => key, key => bundle.Get(key).ToString()); var action = intent.GetStringExtra("action"); if (!string.IsNullOrEmpty(action)) { NotificationActionService.TriggerAction(action, dict); } } } catch (Exception ex) { // 尝试捕获错误 } } }
样式文件配置
values/styles.xml
<?xml version="1.0" encoding="utf-8" ?> <resources> <style name="MainTheme" parent="MainTheme.Base"> <item name="colorAccent">#3E94FF</item> <item name="android:datePickerDialogTheme">@style/CustomDatePickerDialog</item> </style> <style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowBackground">@drawable/splash</item> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowActionBar">false</item> <item name="android:windowIsTranslucent">true</item> </style> <style name="CustomDatePickerDialog" parent="ThemeOverlay.AppCompat.Dialog"> <!-- 头部背景 --> <item name="colorAccent">#3E94FF</item> <!-- 选中日期 --> <item name="android:colorControlActivated">#3E94FF</item> <!-- 取消/确认按钮 --> <item name="android:textColor">#000000</item> </style> </resources>
values-night/styles.xml
<?xml version="1.0" encoding="utf-8" ?> <resources> <style name="MainTheme" parent="MainTheme.Base"> <item name="colorAccent">#3E94FF</item> <item name="android:datePickerDialogTheme">@style/CustomDatePickerDialog</item> </style> <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar"> <item name="android:windowBackground">@drawable/splash</item> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowActionBar">false</item> <item name="android:windowIsTranslucent">true</item> </style> <style name="CustomDatePickerDialog" parent="ThemeOverlay.AppCompat.Dialog"> <!-- 选中日期 --> <item name="android:colorControlActivated">#3E94FF</item> <!-- 取消/确认按钮 --> <item name="android:textColor">#ffffff</item> <!-- 主体背景 --> <item name="android:windowBackground">#2F343C</item> <!-- 月历日期 --> <item name="android:textColorPrimary">#9BA3B1</item> <!-- 星期标题 --> <item name="android:textColorSecondary">#ffffff</item> </style> </resources>
AndroidManifest配置
Application标签使用SplashTheme作为默认样式:
android:theme="@style/SplashTheme"
恳请协助定位问题原因,感谢!
内容的提问来源于stack exchange,提问作者MattC
相关产品推荐
相关产品推荐

