您的位置:首页 > 其它

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

2015-10-23 13:56 239 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: