Android调用js方法以及js调用Android方法

来源:互联网 发布:万网域名怎么解析 编辑:程序博客网 时间:2024/06/05 00:35

Android的一般使用WebView.loadUrl(url);加载指定的|网页文件展示,并且可以实现的JavaScript脚本与本地的Java代码的交互。

1、Android 的WebView加载html页面

       WebView myWebView = (WebView) findViewById(R.id.myWebView);
       //允许WebView执行JavaScript
myWebView.getSettings().setJavaScriptEnabled(true);
       //把js绑定到全局的XJYJS上,让JS可以访问JavaScriptinterface中的方法, JavaScriptinterface中也可以调用JS中的方法。XJYJS 是与JS约定的 (随便起就行),作用是:JS可以通过 window.XJYJS.getMsg() 调用 JavaScriptinterface中的getMsg(),该方法须添加@JavascriptInterface注解
        myWebView.addJavascriptInterface(new JavaScriptinterface(this,myWebView ),"XJYJS");
myWebView.setWebViewClient(new WebViewClient());
       myWebView.loadUrl(url);

2、创建JavaScriptinterface类

public class JavaScriptinterface {    Context context;    public JavaScriptinterface(Context c,WebView mWebView) {        context= c;    }    /**     * 与js交互时用到的方法,在js里直接调用的(window.XJYJS.getMsg(str))     */    @JavascriptInterface    public void getMsg() {        
String string = "原生给JS的数据";call = "javascript:showMsg(\"" + string + "\")";mWebView.post(new Runnable() {    @Override    public void run() {        mWebView.loadUrl(call);    }});
}
}
3、html代码 
<HTML>  <HEAD>  <meta name="viewport" content="width=device-width, target-densitydpi=device-dpi" />  <META http-equiv="Content-Type" content="text/html; charset=UTF-8">  <script>     function showMsg(res){      alert(res);   }   </script>  </HEAD>  <BODY>  <span>测试js使用</span>  <button id='btntest' onclick='window.myjs.getMsg()'>JS调用原生方法</button></BODY>  </HTML> 
 
4、AndroidManifest.xml中加权限   
<uses-permission android:name="android.permission.INTERNET"/>
总结:
以上是Android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用的思路是java调用js方法,js方法执行完毕,再次调用java代码将值返回。
Android 4.4之后使用evaluateJavascript即可。这里展示一个简单的交互示例具有返回值的js方法。
JS代码
function getMsg() {      return 1;}

Android的代码时用evaluateJavascript方法调用

private void testEvaluateJavascript(WebView webView) {  webView.evaluateJavascript("getMsg()", new ValueCallback<String>() {  @Override  public void onReceiveValue(String value) {      Log.i(LOGTAG, "onReceiveValue value=" + value);  }});}

输出结果

onReceiveValue value=1

evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。
 
参考的博客:http://www.jianshu.com/p/4542be29807e

原创粉丝点击