Xamarin 初始屏幕示例在 phone 的横向模式下不起作用。如何解决?

Xamarin Splash screen example does not work in landscape mode on a phone. How to fix it?

我从 Xamarin 网站下载了启动画面示例: http://developer.xamarin.com/guides/android/user_interface/creating_a_splash_screen/

我编译了它并 运行 它在我的 phone 上: http://www.gsmarena.com/samsung_galaxy_fresh_s7390-5841.php

在纵向模式(垂直)下握住我的 phone 时工作正常。启动画面变得直接可见,几秒钟后,带有按钮的视图变得可见。关闭并重新启动应用程序时,它仍然可以正常工作。

之后,我再次将其关闭并将 phone 保持在横向(水平)模式。现在,我再次启动了该应用程序。我的 phone 被冻结了几秒钟,飞溅没有变得可见。之后,我用按钮看到了我的视图。

当您尝试重现此问题时,请确保您:

我该如何解决这个问题?

您链接的 Xamarin sample 有很大问题:

[Activity(Theme = "@style/Theme.Splash", MainLauncher = true, NoHistory = true)]
public class SplashActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        Thread.Sleep(10000); // Simulate a long loading process on app startup.
        StartActivity(typeof(Activity1));
    }
}

ActivityOnCreate()方法在UI线程上执行,因此在其中调用Thread.Sleep()会锁定主线程,可能会生成一个Application未响应 (ANR) 显示给用户。

这是 Xamarin 文档中的错误,您 不应该 运行 UI 线程上的 Thread.Sleep(),尤其是在其中一个线程中activity.

的核心生命周期回调

通过使用后台线程执行休眠然后回调启动画面 activity 启动下一个 activity:

来解决此问题
[Activity(Theme = "@style/Theme.Splash", MainLauncher = true, NoHistory = true)]
public class SplashActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        System.Threading.Tasks.Task.Run( () => {
            Thread.Sleep(10000); // Simulate a long loading process on app startup.
            StartActivity(typeof(Activity1));
        });
    }
}

我刚刚发现了另一个解决方案。使用计时器有点奇怪,但它解决了问题。

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        System.Timers.Timer t = new System.Timers.Timer(1);
        t.Elapsed += (o, e) =>
        {
            t.Stop();
            Thread.Sleep(10000); // Simulate a long loading process on app startup.
            StartActivity(typeof(Activity1));
        };
        t.Start();
    }