混合开发交互中遇到的一些问题

JS与AndroidWebView互相调用,达到各种辅助的效果。
首先JAVA(Android)调用JS,怎么调用?有什么用处?
然后JS调用JAVA呢?下面给出一些浅析。
首先贴上JS代码中的function(方法):

    <!--JS调用JAVA(Android)时候使用-->
    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);
    }




    <!-- Android调用JS时候使用-->
    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.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值