Android WebView与JS交互及消息处理

  前一段时间做公司的项目,涉及到WebView与JS之间的通信,于是在网上查了点资料研究了一下下。


  一、WebView与JS交互

    1.JS调用本地方法

    这个功能的实现还是比较容易的。直接调用WebView的该方法就可以添加接口了,不过先要启动交互

// 启用javascript  
mWebView.getSettings().setJavaScriptEnabled(true);
// 添加接口
public void addJavascriptInterface (Object object, String name) 


    Object是JS调用本地的类的对象,name是对象的别名,在JS可以用这个别名+点语法+方法名就可以调用本地的方法。例如:

WebView mWebView;
		
// ...
		
mWebview.addJavascriptInterface(this, "myjs");

    再定义一个JS可以调用的方法:

public void jsFunction(String string) {
		System.out.println("js调用了这个方法:" + string);
}
    这样在JS就可以调用这个方法

    注意:该方法不可以定义成私有的,不然JS就不能调用


    2.本地调用JS方法

    这个就更容易了- -,直接用以下方法就行了,假设JS上有一个方法叫androidFunction()

mWebview.loadUrl("javascript:androidFunction()");


  二、消息处理

    1、遇到Uncaught ReferenceError:...错误

    出现该错误不会崩溃,它的意思是本地方法调用JS时没有找到调用的方法。万一我们调用的方法不存在,需要做相应的处理怎么办?Shamoo尝试try ... catch ...抓取一下异常,发现什么都没有抓到...后来仔细看了一下错误Log的TAG,是Web Console。Shamoo想肯定有办法抓取这个异常的,于是看了一下官方文档,终于发现了这么一个方法:

mWebview.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
        // TODO Auto-generated method stub
	if (consoleMessage.message().contains("Uncaught ReferenceError")) {
			// do something...
	}
	return super.onConsoleMessage(consoleMessage);
    }
});
    这个方法可以监听WebView的控制台消息,然后判断一下消息是否包含“Uncaught ReferenceError”就可以捕获该消息了

    2.获取JS方法的返回值

    仔细观察会发现WebView的loadUrl方法是没有返回值的,那要是想要获取JS方法的返回值就该怎么做呢?Shamoo查了一些资料,发现网上也没有很好的解决办法,后来只能通过回调的方法来实现返回,虽然很不灵活,不过也没有办法...

    在loadUrl调用JS的一个方法,然后JS执行方法的时候,再调用Android本地的一个方法,并把返回值作为参数传递下来。





Android WebView与JS交互及消息处理,布布扣,bubuko.com

Android WebView与JS交互及消息处理

上一篇:android开发错误之Unable to execute dex: Multiple dex files define


下一篇:服务器的使用评价