You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:40:23