package com.wyp.materialqqlite; import android.content.Context; import android.os.Handler; import android.os.Message; import android.webkit.JavascriptInterface; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; /* 使用注意: 1:由于WebView只能在UI主线程调用,所以必须在UI主线程创建该类对象。 2:当在后台线程想通过该类运行JS脚本的时候,需要使用sendMsg_RunJs,而不能使用runJs。 3:目前的JS返回值只支持返回单一String类型。 4:混淆代码的时候需要在proguard-project.txt里面添加以下代码。 proguard-project.txt: -keepclassmembers class com.zym.mingqq.JsEngine$JsObject { public *; } -keepattributes *Annotation* -keepattributes *JavascriptInterface* android webview中调用了js的时候混淆注意事项 http://blog.csdn.net/minenamewj/article/details/40112335 */ // 使用WebView封装的JS脚本引擎 public class JsEngine { private Context m_context; private WebView m_webView; private Handler m_hCallBack; private JsObject m_jsObject; private Handler m_hRunJs = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: // 调用JS代码计算密码Hash JsObject jsObj = (JsObject)msg.obj; runJs(jsObj.getUrl(), jsObj.getFuncName(), jsObj.getArg()); break; default: break; } } }; public JsEngine(Context context) { m_context = context; m_webView = new WebView(m_context); m_jsObject = new JsObject(); WebSettings setting = m_webView.getSettings(); setting.setJavaScriptEnabled(true); m_webView.addJavascriptInterface(m_jsObject, "JsObject"); } // 设置回调通知句柄 public void setCallBackHandler(Handler handler) { m_hCallBack = handler; } public void sendMsg_RunJs(String strUrl, String strFuncName, String strArg) { m_jsObject.setResult(""); // 清空上一次执行的返回值 if (m_hRunJs != null) { JsObject jsObj = new JsObject(); jsObj.setUrl(strUrl); jsObj.setFuncName(strFuncName); jsObj.setArg(strArg); Message msg = m_hRunJs.obtainMessage(); msg.what = 0; msg.arg1 = 0; msg.arg2 = 0; msg.obj = jsObj; m_hRunJs.sendMessage(msg); } } // 运行JS脚本代码 public void runJs(String strUrl, String strFuncName, String strArg) { try { m_jsObject.setUrl(strUrl); m_jsObject.setFuncName(strFuncName); m_jsObject.setArg(strArg); m_jsObject.setResult(""); // 清空上一次执行的返回值 m_webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { String strUrl = "javascript:" + m_jsObject.getFuncName() + "("; String strArg = m_jsObject.getArg(); if (strArg != null && strArg.length() > 0) strUrl += strArg; strUrl += ")"; m_webView.loadUrl(strUrl); super.onPageFinished(view, url); } }); m_webView.loadUrl(strUrl); } catch (Exception e) { e.printStackTrace(); } } // 获取JS返回值 public String getJsResult() { return m_jsObject.getResult(); } // 设置JS返回值 public void setJsResult(String strResult) { m_jsObject.setResult(strResult); } public class JsObject { private String m_strUrl; private String m_strFuncName; private String m_strArg; private String m_strResult; public String getUrl() { return m_strUrl; } public void setUrl(String strUrl) { m_strUrl = strUrl; } public String getFuncName() { return m_strFuncName; } public void setFuncName(String strFuncName) { m_strFuncName = strFuncName; } public String getArg() { return m_strArg; } public void setArg(String strArg) { m_strArg = strArg; } public String getResult() { return m_strResult; } public void setResult(String strResult) { m_strResult = strResult; } @JavascriptInterface public void returnResult(String strResult) { System.out.println(strResult); setResult(strResult); // 通知回调接口获取JS的返回值 if (m_hCallBack != null) { m_hCallBack.sendEmptyMessage(0); } } } }