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);
}
}
}
}