您的位置:首页 > 其它

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对象;

参考:12
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: