混合编程:java和js代码相互调用;
举例:网页中点击拨打电话;
方式:
1.android中的java代码调用webview中的javascript脚本,并可以传递参数;
步骤:开启支持js,loadUrl加载;传递参数时自己拼接,string型要用单引号括起来;
2.webview中的js调用本地的java代码,并可以传递参数;
步骤:webview要绑定javascript接口,this是这个类的实例化对象,wst是这个对象在js中的别名,所以js便可通过这个别名调用本地java方法contentWebView.addJavascriptInterface(this, "wst");
在webview中点击图片,在activity中加载图片
方案思路:
1.在点击图片的时候调用本地的java方法并给出响应的图片地址。需要给这个点击事件加上相应的js函数,让点击事件调用的js函数来调用我们提前准备好的java函数,等我们捕获到图片的url剩下的就好处理了。
2.本地获得图片地址后,开启一个遮罩activity进行显示和处理。
参考:http://blog.csdn.net/wangtingshuai/article/details/8635787
1.java调用js:
webview.load(url);
若js方法的作用时弹出对话框、网站图标、标题、进度条等,需要使用setWebChromeClient的回调方法来执行;
1.1 webview.load(“javascirpt:callJS()”);
callJS()为html中的一个方法;
1.2 webview.evaluateJavascript(“javascript:callJS()”,new ValueCallback(String){onReceiveValue()});
区别:
方式一效率低,全版本可用,适用于不要求性能且无返回值的情况;
方式二效率高,但在4.4后才可用,适用于追求性能、有返回值的情况;
2.js调用java:
2.1.addJavaInterface(new JsAndroid(),”test”)将java对象映射到js对象;
参数1.java对象名,为与JS对象映射关系的Android类,类中的方法名即js代码中要调用的,注意这个方法要用注解;
参数2.js代码中的对象名;
缺点:严重漏洞;
2.2约定协议:
步骤:
1.在JS中约定所需要的Url协议:如 function callAndroid(){document.location = "js://webview?arg1=111&arg2=222";}
2.webview.setWebviewClient(),传入new对象,复写shouldOverrideUrlLoading()方法。当webview.loadurl()时该方法就会回调;
3.回调中根据scheme协议格式和authority协议名判断是否是所需要的url;如两个参数都匹配,则拦截url,JS开始调用java方法;
缺点:JS获取java方法的返回值复杂,只能通过webview的loadUrl()执行JS方法把返回值传回去,如
2.3android通过WebChromeClient的对话框回到方法分别拦截JS的对话框,
得到消息内容后解析;
常用的是拦截prompt(0方法,因为其可返回任意类型;
步骤:
1.JS代码调用prompt(:js:demo?arg1=111&arg2=222);
2.WebviewClient触发onJsPrompt()回调,拦截输入框;message代表prompt()的内容,result代表返回值;
区别:
方式一最简洁,4.2以下存在漏洞;
方式二使用复杂,要进行协议约束,从java层王js层传值繁琐;
方式三要进行协议于淑;
参考:
webview坑:
1.展示webviewActivity可新开一进程,webivew产生OOM时也不会影响主程序;
2.动态往viewgroup中添加,在onDestroy中先从viewgroup中移除,再将webview的所有view移除;webview创建时传入applicationContext,使之销毁时不再持有activity对象;