Android 在第'页中使用Device.OpenUri时,会在浏览器中打开两个选项卡;s-OnAppearing方法

Android 在第'页中使用Device.OpenUri时,会在浏览器中打开两个选项卡;s-OnAppearing方法,android,xamarin,browser,xamarin.forms,uri,Android,Xamarin,Browser,Xamarin.forms,Uri,当我打开Android的默认内置浏览器时,它会打开两个选项卡,而不是一个。 我有一个主页和一个第1页。在主页中,我有一个按钮,可以将用户指向第1页 Page1.xaml没有什么特别之处,因为它是默认的xaml模板。 Page1.xaml.cs: public partial class Page1 : ContentPage { public Page1 () { InitializeComponent (); } protected overr

当我打开Android的默认内置浏览器时,它会打开两个选项卡,而不是一个。 我有一个主页和一个第1页。在主页中,我有一个按钮,可以将用户指向第1页

Page1.xaml没有什么特别之处,因为它是默认的xaml模板。 Page1.xaml.cs:

public partial class Page1 : ContentPage
{
    public Page1 ()
    {
        InitializeComponent ();
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        Device.OpenUri(new Uri("https://stackoverflow.com"));
    }
}
问题:当我进入Page1时,默认的Android浏览器(即Google Chrome)会打开网站的两个选项卡,而不是一个

更新:在调试时,我注意到只有在OnAppearing()方法中使用Device.OpenUri时才会出现此问题,因为在构造函数中使用时不会出现此问题

更新:我试图通过DependencyService使用本机(例如Android)机制,但这也不起作用:

var uri = Android.Net.Uri.Parse("https://stackoverflow.com");
                var intent = new Intent(Intent.ActionView, uri );
                intent.SetFlags(ActivityFlags.NewTask);
                Application.Context.StartActivity(intent);
所以我认为这个问题一定是来自Android方面,而不是Xamarin.Forms

更新:奇怪的是,如果我在打开浏览器之前延迟了一段时间,如下面的代码所示,那么问题就不会再发生了:

protected override async void OnAppearing()
{
    base.OnAppearing();

    await Task.Delay(500);
    Device.OpenUri(new Uri("https://stackoverflow.com"));
}
尽管这可能是解决这个问题的临时方法,但我希望有人能找到解决办法

当我进入Page1时,默认的Android浏览器(即Google Chrome)会打开网站的两个选项卡,而不是一个

我认为原因是调用了
Device.OpenUri()
之后,
OnAppearing()
再次启动了。当您从浏览器返回时,应该调用它,但它会更早调用。浏览器显示并启动了
Page1
OnDisappearing()
。之后,第二个
OnAppearing()
启动

在您的解决方案中,当您从浏览器返回时,第二个
OnAppearing()
将被触发。但它会再次打开URI

我认为您应该将代码移动到其他位置,例如单击的
按钮
Page1()

例如:

public Page1 ()
{
    InitializeComponent ();
    Device.OpenUri(new Uri("https://stackoverflow.com"));
}

即使是第一次进入Page1,浏览器也会打开两个选项卡!实际上,当我一直在OnAppearing方法中放置断点时,它只触发了一次而不是两次。不过,您是对的,通过从浏览器返回,OnAppearing方法将再次被激发,但在我的实际项目中,我有一种机制,可以在返回页面时禁用打开浏览器,因此这不会在这里产生问题。@Vahid如果您在
设备.OpenUri()
之后设置断点,您将发现它被激发了两次。您是对的。但这对我来说很奇怪。为什么要发射两次?Device.OpenUri也调用OnAppearing吗?顺便问一句,为什么在等待任务时。Delay(500)放在Device.OpenUri()之前,OnAppearing只触发一次?@Vahid我认为第二个
OnAppearing()
不是由
Device.OpenUri()调用的。它可能与
导航.PushAsync()
有关。如果我把
Device.OpenUri()
放在主页的
OnAppearing()
方法中,它就没有这个问题。我已就这一问题作了报告。我将继续关注它。