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

时间:2017-12-25 01:58:04

标签: xamarin webview youtube xamarin.forms xamarin.android

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

Tried Solutions

我尝试过寻找类似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
            }
        };
    }
}

1 个答案:

答案 0 :(得分:1)

使用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

接口:

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();
    }
}

实施例

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();
}