(转载) 混合开发交互中遇到的一些问题
![](http://static.blog.csdn.net/images/category_icon.jpg)
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;
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.
首先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
- 上一篇TextView使用一些小技巧
- 下一篇Android6.0的改变
暂无评论