2. 拦截WebView事件

2.1 问题

应用程序使用WebView显示内容,但在用户点击页面中的链接时还需要监听和响应。

2.2 解决方案

(API Level 1)
实现一个WebViewClient并把它关联到WebView上。WebViewClient和WebChromeClient是两个WebKit类,它们可以让应用程序获得WebView的事件回调并且可以自定义WebView的行为。默认情况下,在没有指定WebViewClient时,WebView会将一个URL传递给ActivityManager处理。而ActivityManager通常会在浏览器应用程序中打开用户点击的链接,而不是当前的WebView中。

2.3 实现机制

在代码清单中,可创建一个含有WebView的Activity,该WebView将处理它自己的URL加载。

带有一个WebView的Activity的Activity,该WebView会处理URL

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        WebView webview = new WebView(this);
        webview.getSettings().setJavaScriptEnabled(true);
        //添加一个客户端到视图上
        webview.loadUrl("http://www.baidu.com/");

        setContentView(webview);
    }
}

在本例中,只是简单地为WebView提供了一个单纯功能的WebViewClient,它可以让WebView自己处理所有的URL请求,而不是将这些请求传递给ActivityManager,因此点击一个链接会在原来的视图中加载请求的页面,这是因为shouldOverrideUrlLoading()的默认实现会简单地返回false,告诉客户端将URL传递给WebView而不是应用程序。
在下一个示例中,我们将利用WebViewClient.shouldOverrideUrlLoading()回调来拦截和监控用户的Activity(参见以下代码清单)。
拦截WebView URL的Activity

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        WebView webview = new WebView(this);
        webview.getSettings().setJavaScriptEnabled(true);
        //添加一个客户端到视图上
        webView.setWebViewClient(mClient);
        webview.loadUrl("http://www.baidu.com/");

        setContentView(webview);
    }
    
    private WebViewClient mClient = new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Uri request = Uri.parse(url);
            if (TextUtils.equals(request.getAuthority(),"www.baidu.com")){
                //允许加载
                return false;
            }
            Toast.makeText(MyActivity.this,"Sorry,buddy",Toast.LENGTH_SHORT).show();
            return true;
        }
    };
}

在本例中,shouldOverrideUrlLoading()会根据传入的URL决定使用是否要在WebView中加载内容,防止用户离开百度的网站。Uri.getAuthority()会返回一个URL的主机域名部分,我们会使用它检测用户点击的链接是否是百度的域名(www.baidu.com)。如果能够确认链接指向的是百度的其他页面,会返回false,从而允许WebView加载内容。如果不是,会通知用户并返回true,然后通知WebViewClient应用程序已经处理了这个URL,不允许WebView加载它。
这项技术还能变得更加复杂,应用程序可以对URL做各种实际处理。通过自定义的处理方式,还可以在应用程序和WebView的内容之间打造一个完整的交互接口。

猜你喜欢

转载自blog.csdn.net/qq_41121204/article/details/83782537
2.