JS与AndroidWebView互相调用,达到各种辅助的效果。
首先JAVA(Android)调用JS,怎么调用?有什么用处?
然后JS调用JAVA呢?下面给出一些浅析。
首先贴上JS代码中的function(方法):
function submit (){
var msg=document.getElementById("text_msg").value;
//实现调用的语句
Android.onSubmit(msg);
}
function add(){
document.getElementById("text_num").value++;
var num=document.getElementById("text_num").value;
//实现调用的语句
Android.onSubmitNum(num);
}
function dec(){
document.getElementById("text_num").value--;
var num=document.getElementById("text_num").value;
//实现调用的语句
Android.onSubmitNum(num);
}
function returnNum( num){
var num= Android.getAndroidNum();
document.getElementById("text_num").value=num;
}
function returnMsg( ){
var msg= Android.getAndroidMsg();
document.getElementById("text_msg").value=msg;
}
在互调之前要做的就是设置WebView支持JS
webSettings.setJavaScriptEnabled(true);
这行必须要有的,
然后就是互调的问题了,先看看JAVA调用JS:
这个其实很简单,首先该页面展示WebView,WebView有个loadUrl的API,那么就可以利用这个来加载,
比如我们调用文章前面给出的JS方法我们就可以
webView.loadUrl("javascrip:returnNum");
webView.loadUrl("javascrip:returnMsg");
这样我们就完成了,
使用场景:比如服务端想通过JS返回给我们一些参数或者数据,那么我们完全可以通过这样来接受到这些数据(这是比较高级点的)
正常的就是你想要本地对页面上面进行一些操作,那么这样就能完全达到你的要求了。
下面就是比较复杂一点JS调用JAVA了: 这个调用可以有好几种方式,不过总结起来就是一个@JavaScriptInterface接口的灵活运用, 可以直接在Android中程序中写入 @JavascriptInterface public void JStoJAVA() { //需要实现的功能 } 然后再JS里面就可以在上面实现调用语句的位置写上xxx.JStoJAVA(); 这里做个详细的解释吧,程序里面如果是这套的话xxx可以是任何不为空的字符(建议使用英文) 然后是后面参数也可以加入String型的(C端是可以接收的,如果是很多的话,建议使用JSON转成字符串传递) 我举个例子吧, @JavascriptInterface public void JStoJAVA(String s) { //需要实现的功能 String ss = s;//这个ss就可以拿到Android程序中随意使用了,其实也就实现了服务端传数据给C端 } //这是服务端调用代码 xxx.JStoJAVA(s);//s就是服务端传输的数据 这种唯一性很差,但是多出调用就好用了(假如很多个WebView都需要调用,xxx就区分不开了) 下面给出一种唯一性比较好的: webView.addJavascriptInterface(new JStoJAVA(), "Android"); //是在Activity中内部类(后面会解释为什么用内部类) public class JStoJAVA{ //javascript to java methods @JavaScriptInterface public void onSubmit(String s){ //JS调用了Android方法,并且C端接收到了数据 } @JavaScriptInterface public void onSubmitNum(String s){ //JS调用了Android方法,并且C端接收到了数据 } } } 这种就是上面JSfunction中所使用的调用方法了, 即:Android.onSubmit(msg); 然后还有一种就是直接添加,不使用内部类。 下面说一下我是用内部类的原因吧,这个其实主要跟打包混淆有关系,JS互调还有一个难点就是打包完了, 如果开启混淆,不处理的话,服务端就调不起来你的代码了,所以这些就不能混淆了,那么怎么写混淆了, 百度上面也有各种各样的,我说说我的吧,首先如果写第一种的换可以这样写混淆: -keepclassmembers class * extends android.app.Activity { public void JStoJAVA(参数自己看看吧); } -keepattributes *Annotation* -keepattributes *JavascriptInterface* 第二种内部类混淆方法:(保持内部类不被混淆,里面的方法自然就可以了) -keep public class 包名.Activity名字$JS投JAVA {*;} -keepattributes *Annotation* -keepattributes *JavascriptInterface* 第三种我也不会,尝试了网上的方法都不行,也不知道为什么。 求高手指教一下,新手入门,不是太懂,见谅,谢谢! 先写到这里吧,有什么讨论的、指正的请联系邮箱:jsmeli@163.com.