在Xamarin.Forms应用程序中离开页面后,Webview不会关闭

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Xamarin.Forms应用程序中离开页面后,Webview不会关闭相关的知识,希望对你有一定的参考价值。

在我离开webview页面后,我花了很多时间试图弄清楚如何阻止webview处于活动状态。我之所以发现这一点,是因为Google Play商店拒绝了该应用,因为应用程序违反了youtube的条款和服务。这是因为即使页面已经离开,YouTube视频也会在后台继续播放。我正在使用xamarin.forms在.cs文件中创建webview(如下所示)。以下代码是我在应用程序内显示youtube视频频道的方式。这个目前运行跨平台:ios / android

试过的解决方案

我试过寻找下面的onPause()解决方案:

@Override
protected void onPause() {
    mWebView.onPause();
    super.onPause();
}

但是,xamarin webviews无法访问OnPause()。

我也调查过了

Webview.loadUrl("about:blank"); 

但我不确定如何将其合并到应用程序中,以便每当应用程序离开webview页面时它都会执行。

现行守则

public partial class YoutubePage : ContentPage
{
    public YoutubePage ()
    {
        InitializeComponent();
        WebView webView = new WebView
        {
            Source = new UrlWebViewSource
            {
                Url = "https://www.youtube.com/",
            },
            VerticalOptions = LayoutOptions.FillAndExpand
        };

        this.Content = new StackLayout
        {
            Children =
            {
                webView
            }
        };
    }
}
答案

使用OnDisappearing生命周期事件将WebView设置为空白页:

protected override void OnDisappearing()
{
    webView.Source = "about:page";
    base.OnDisappearing();
}

使用OnAppearing生命周期事件将WebView的源设置回原始内容:

protected override void OnAppearing()
{
    base.OnAppearing();
    webView.Source = "https://youtube.com";
}

这当然会破坏用户体验,如果你想暂停/恢复Android.WebKit.WebView,你可以继承WebViewWebViewRender来添加该功能。

PausableWebView

Interface:

public interface IPausableWebViewRenderer
{
    void Pause();
    void Resume();
}

Xamarin.Forms PausableWebView:

public class PausableWebView : WebView
{
    public IPausableWebViewRenderer Renderer;

    public void Pause()
    {
        if (renderer != null) renderer.Pause();
    }

    public void Resume()
    {
        if (renderer != null) renderer.Resume();
    }
}

Xamarin.Android PausableWebViewRenderer:

public class PausableWebViewRenderer : WebViewRenderer, IPausableWebViewRenderer
{
    Android.Webkit.WebView webView;

    public PausableWebViewRenderer(Android.Content.Context context) : base(context) { }

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
    {
        base.OnElementChanged(e);

        webView = Control;
        if (e.OldElement != null)
            (e.OldElement as PausableWebView).Renderer = null;
        if (e.NewElement != null)
            (e.NewElement as PausableWebView).Renderer = this;
    }

    public void Pause()
    {
        if (webView != null) webView.OnPause();
    }

    public void Resume()
    {
        if (webView != null) webView.OnResume();
    }
}

Example:

XAML:

<local:PausableWebView x:Name="webView" Source="https://youtube.com" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" />

OnDisappearing / OnAppearing:

protected override void OnDisappearing()
{
    webView.Pause();
    base.OnDisappearing();
}

protected override void OnAppearing()
{
    base.OnAppearing();
    webView.Resume();
}

以上是关于在Xamarin.Forms应用程序中离开页面后,Webview不会关闭的主要内容,如果未能解决你的问题,请参考以下文章

在 Xamarin.Forms 中使用 MVVM 进行页面导航

Xamarin.Forms - 页面缓存

Xamarin Forms Master Detail 将 Master 保留在左侧

Xamarin.Forms 页面底部到顶部动画

xamarin.forms 中的页面生命周期事件

单击 Xamarin.Forms 中的 ListView 项后完整显示详细信息