【问题标题】:Xamarin Android - Splash Screen Doesn't Work On ResumeXamarin Android - 启动画面在恢复时不起作用
【发布时间】:2018-06-11 01:32:14
【问题描述】:

我关注了这篇文章,并将信息与其他文章拼凑在一起,创建了一个启动画面: https://docs.microsoft.com/en-us/xamarin/android/user-interface/splash-screen

当我通过点击应用程序图标启动应用程序时,启动画面效果很好。但是,如果应用程序已经在运行并且我切换到它,则在应用程序恢复时屏幕会变白几秒钟。为什么?

这是我的代码:

    [Activity(Label = "Hardfolio", Icon = "@drawable/icon", Theme = "@style/MyTheme.Splash", MainLauncher = true, NoHistory = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class SplashActivity : FormsAppCompatActivity
    {
        static readonly string TAG = "Hardfolio: " + typeof(SplashActivity).Name;

        public override void OnCreate(Bundle savedInstanceState, PersistableBundle persistentState)
        {
            base.OnCreate(savedInstanceState, persistentState);
        }

        // Launches the startup task 
        protected override void OnResume()
        {
            base.OnResume();
            var startupWork = new Task(AppStartup);
            startupWork.Start();
        }

        // Simulates background work that happens behind the splash screen 
        async void AppStartup()
        {
            StartActivity(new Intent(Application.Context, typeof(MainActivity)));
        }
    }




    [Activity(Label = "Hardfolio", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = false, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    [IntentFilter(new[] { UsbManager.ActionUsbDeviceAttached })]
    [MetaData(UsbManager.ActionUsbDeviceAttached, Resource = "@xml/device_filter")]
    public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        #region Fields
        private AndroidHidDevice _TrezorHidDevice;
        private UsbDeviceAttachedReceiver _UsbDeviceAttachedReceiver;
        private UsbDeviceDetachedReceiver _UsbDeviceDetachedReceiver;
        private object _ReceiverLock = new object();
        #endregion

        #region Overrides
        protected override void OnCreate(Bundle bundle)
        {
            try
            {
                _TrezorHidDevice = new AndroidHidDevice(GetSystemService(UsbService) as UsbManager, ApplicationContext, 3000, 64, TrezorManager.TrezorVendorId, TrezorManager.TrezorProductId);

                ServicePointManager.ServerCertificateValidationCallback += (o, certificate, chain, errors) => true;

                TabLayoutResource = Resource.Layout.Tabbar;
                ToolbarResource = Resource.Layout.Toolbar;

                base.OnCreate(bundle);

                Xamarin.Forms.Forms.Init(this, bundle);

                RegisterReceiver();

                var application = new App(new CrossPlatformUtilities(new IsolatedStoragePersister(), new AndroidRESTClientFactory()), _TrezorHidDevice, GetPin);

                LoadApplication(application);
            }
            catch (Exception ex)
            {
                Logger.Log("Android crash", ex, nameof(Wallet.Droid));
                Toast.MakeText(ApplicationContext, ex.ToString(), ToastLength.Long).Show();
            }
        }

        private async Task<string> GetPin()
        {
            var taskCompletionSource = new TaskCompletionSource<string>();

            RunOnUiThread(async () =>
            {
                var pin = await TrezorPinPad.GetPin();
                taskCompletionSource.SetResult(pin);
            });

            return await taskCompletionSource.Task;
        }

        protected override void OnResume()
        {
            base.OnResume();

            Logger.Log($"Resuming... Setting up Trezor listeners. _TrezorHidDevice is {(_TrezorHidDevice == null ? "null" : "not null")}", null, nameof(Wallet.Droid));

            RegisterReceiver();
        }

        private void RegisterReceiver()
        {
            try
            {
                lock (_ReceiverLock)
                {
                    if (_UsbDeviceAttachedReceiver != null)
                    {
                        UnregisterReceiver(_UsbDeviceAttachedReceiver);
                        _UsbDeviceAttachedReceiver.Dispose();
                    }

                    _UsbDeviceAttachedReceiver = new UsbDeviceAttachedReceiver(_TrezorHidDevice);
                    RegisterReceiver(_UsbDeviceAttachedReceiver, new IntentFilter(UsbManager.ActionUsbDeviceAttached));

                    if (_UsbDeviceDetachedReceiver != null)
                    {
                        UnregisterReceiver(_UsbDeviceDetachedReceiver);
                        _UsbDeviceDetachedReceiver.Dispose();
                    }

                    _UsbDeviceDetachedReceiver = new UsbDeviceDetachedReceiver(_TrezorHidDevice);
                    RegisterReceiver(_UsbDeviceDetachedReceiver, new IntentFilter(UsbManager.ActionUsbDeviceDetached));
                }
            }
            catch (Exception ex)
            {
                Logger.Log($"Error registering Hid receivers", ex, nameof(Wallet.Droid));
            }
        }
        #endregion
    }

【问题讨论】:

  • 启动画面仅用于在您的应用程序首次启动时显示!
  • 这不是答案。我需要在应用程序之间切换时显示启动画面。白屏让用户认为出了点问题。
  • 是的,这不是答案,所以我把它放在评论中。

标签: java c# android xamarin.android splash-screen


【解决方案1】:

如果您从另一个应用程序中启动您的应用程序/或使用 ClearTask 标志/或如果您的应用程序正在执行冷启动(已在后台关闭),也许还有其他方式,您将看到“预览”屏幕,这是您当前主题的背景(类似于您已经为 SplashScreen 所做的事情,它显示了主题背景)...

但如果你的“@style/MainTheme”有一个简单的白色背景,这将是你重新进入应用时可能会看到的。

因此您可以考虑在 OnCreate 中使用“SetTheme”方法。此链接中有更多相关信息:

https://developer.android.com/topic/performance/vitals/launch-time

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多