转自:http://www.jianshu.com/p/2b9ed6aa13ec
Java 与 Javascript 交互
最近遇到这样一个需求,Android 程序中需要使用 WebView 来加载一个网页,而这个网页会根据请求的参数正确与否返回不同的内容。当请求参数正确,则返回正常显示的 HTML 页面。如果请求参数错误,直接返回 json。
所以,我们必须通过 WebView 来对页面内容做出区分,如果是正常的页面内容则显示,反之,则解析其中的 json。我们知道,WebView 提供了一个接口,可以让我们注入 Java 对象到页面中,这样,页面中的 javascript 就能直接访问 Java 对象的接口,从而实现 Java 和 Javascript 的交互。
首先必须启用 WebView 中的 Javascript 支持。
webView.getSettings().setJavaScriptEnabled(true);
注入 Java 对象到 WebView 中。
webView.addJavascriptInterface(new JavascriptHandler(), "handler");
Java 对象定义如下,需要特别注意的是,在 JELLY_BEAN_MR1 之后,只有 public 且添加了 @JavascriptInterface
注解的方法才能被调用。这也是为了安全考虑。毕竟页面可以直接操作 Native Application 有点太可怕了。(没加注解,导致反射无效,查了好久也是醉了)
class JavascriptHandler {
@JavascriptInterface
public void getContent(String htmlContent){
Log.i(TAG, "html content:" + htmlContent);
}
最后,在 WebView 载入完成后的回调方法中调用如下方法就能获得网页的内容了。
@Override
public void onPageFinished(WebView view, String url) {
view.loadUrl("javascript:window.handler.getContent(document.body.innerHTML);");
super.onPageFinished(view, url);
}