hybrid

混合编程: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;如两个参数都匹配,则拦截urlJS开始调用java方法;

缺点:JS获取java方法的返回值复杂,只能通过webviewloadUrl()执行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对象;


参考: 12


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值