详解Android JS相互调用
最近在研究Android、JS相互调用,之前没怎么接触过,只知道loadUrl()就可以加载一个网页了,研究过之后发现Android可以调JS,JS也可以调Android原生控件,很开心啊。下面小编就开始喽:
原理就是Java和JS调用,在Android中是通过WebView来实现的。
下面先说一下简单的Android和JS相互调用
- 首先通过loadurl()来加载网页
- WebView开启JS脚本执行
- Android端提供JS调用的交互接口
简单的看一下代码:
mWebView=(MyWebView)findViewById(R.id.wv_container_information);
mWebSetting=mWebView.getSettings();
mWebSetting.setJavaScriptEnabled(true);
//js调用Android中的方法
mWebView.addJavascriptInterface(this,"XXX");//XXX未html中的方法
/**
*客户端提供send_comment方法被js调用
*by:chenheat:2015/09/28
*
*@paramuuiduuid
*@paramfun_name调用的方法名
*@paramjsonjs给客户端的json
*/
@JavascriptInterface
publicvoidsend_comment(finalStringuuid,finalStringfun_name,finalStringjson){
newThread(newRunnable(){
@Override
publicvoidrun(){
commend=CommandFactory.getInstance().createCommand(fun_name);
if(commend!=null){
commend.setFun_name(fun_name);
commend.setmHandler(mHandler);
commend.setParam(json);
commend.setUuid(uuid);
commend.setWebView(mWebView);
commend.do_result(context);
}
}
}).start();
}
这里通过mWebView.addJavascriptInterface()实现调用JS中的方法,也就是说第二个参数为网页中的方法叫XXX();它里面的参数则为我下面send_command();方法中的参数然后我再做一些操作。最后通过loadurl();就实现调用了。很简答相信大家也都会用,也都用过,那么下面给大家详细介绍一下怎样通过这样的调用来实现JS调用Android端的一些控件。
步骤
- 首先JS调用客服端的某个方法,将需要的参数传递过来
- 然后客户端根据JS的需求去执行相关操作
- 执行完操作之后回掉JS方法
具体实现
第一步就是上面所描述的过程
这里省略了(其中fun_name就是JS要调的方法名字举个例子:比如它想要客户端实现弹出Dialog,那么web端定义一个方法名为:popup.alert)
客服端通过方法名字来执行相关操作
通过方法名我们本地去弹出Dialog,或者根据服务器返回的json数据来执行一些其他复杂的操作,我这里就不具体说明了,可以有很多,比如打开通讯录选择联系人、获取手机唯一标识符、设置导航栏、、弹出日期选择框等等。
执行完相关操作再回调JS的方法将信息返回给JS
比如上面的打开通讯录选择联系人之后我们可以将联系人的手机号姓名等属性通过Json返回给JS。
大体思路就是这样,看一下代码:
@JavascriptInterface
publicvoidsend_comment(finalStringfun_name,finalStringjson){
//根据fun_name处理不同业务
newThread(newRunnable(){
@Override
publicvoidrun(){
//注意此处必须是异步处理
JSONObjectjsonObject=null;
try{
jsonObject=newJSONObject(json);
}catch(JSONExceptione){
e.printStackTrace();
}
Stringtitle=jsonObject.optString("title");
Stringmessage=jsonObject.optString("message");
//TODO:根据message执行相关操作
Messagemsg=newMessage();
msg.what=0;
msg.obj=jsonObject;
handler.senMessage(msg);
}
}).start();
}
/**
*回掉JS方法将处理信息返回给JS
*@paramisSuccess
*@paramjson
*/
publicvoidreturnToJs(finalbooleanisSuccess,finalJSONObjectjson){
Log.d("----","javascript:app_result('"+isSuccess+"','"+json.toString()+"')");
Stringdata="javascript:app_result('"+isSuccess+"','"+json.toString()+"')";
webView.loadUrl(data);
}
privateHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
if(msg.what==0){
//TODO:执行相关操作
returnToJs(true,(JSONObject)msg.obj);
}
}
};
这样就实现了基本的JS调Android原生控件了,主要是和JS配合好就能完美实现了,现在好多的APP都用的这种方式来实现。所以说弄清楚这一块很有必要,其实也没什么,说是JS调用Android,其实就是Android这边提供一个java接口来loadurl()就可以。
以上就是为大家分享的AndroidJS相互调用的具体方法,希望对大家的学习有所帮助。