hybrid
2016-07-01 12:51
155 查看
混合编程: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”)[b]将java对象映射到js[/b]对象;
参数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方法把返回值传回去,如
[b]2.3android通过WebChromeClient的对话框回到方法分别拦截JS的对话框[/b],
得到消息内容后解析;
常用的是拦截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对象;
参考:1,2
举例:网页中点击拨打电话;
方式:
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”)[b]将java对象映射到js[/b]对象;
参数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方法把返回值传回去,如
[b]2.3android通过WebChromeClient的对话框回到方法分别拦截JS的对话框[/b],
得到消息内容后解析;
常用的是拦截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对象;
参考:1,2
相关文章推荐
- [Java] JAVA设计模式
- 互联网协议入门(一)
- 解锁oracle 内部用户
- 如何遍历Hashtable、ArrayList
- [改善Java代码]小心switch带来的空值异常
- 课程总结
- 应用高德地图心得
- [NOIP1999]旅行家的预算
- Spring Web工程web.xml零配置即使用Java Config + Annotation
- 中通快递招聘节开始啦-大牛你等啥呢
- 练习四 1019
- [bzoj3123][SDOI2013]森林
- windows 80端口被占用
- java分布式应用之初:实现系统间通信方式简介
- footer绝对定位但是不在页面最下边解决方案
- LeetCode:Next Permutation
- leetcode 100. Same Tree
- [3.0.1]性能调优之调节并行度
- 矩阵分解(rank decomposition)文章代码汇总
- linxu学习之android(一):linux下安装android studio 、android sdk安装教程