// Instantiate the interface and set the context
WebAppInterface(Context c) {
mContext = c;
}
// Show a toast from the web page
@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
@JavascriptInterface
public int getAndroidVersion() {
return android.os.Build.VERSION.SDK_INT;
}
@JavascriptInterface
public void showAndroidVersion(String versionName) {
Toast.makeText(mContext, versionName, Toast.LENGTH_SHORT).show();
}
JSBridge主要是给javascript和Native相互通信的接口。
javascript调用native
实现方式主要有以下三种:
public class WebAppInterface { Context mContext;
}
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient;
public class WebViewActivity extends AppCompatActivity {
}
window.nativeBridge.postMessage(message);
WebView webview = (WebView) findViewById(R.id.webview); webview.loadUrl('http://imnerd.org'); webview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if(url.equals('sdk:hello')) { System.out.println('hello world'); return true; } return super.shouldOverrideUrlLoading(view, url); } });
//定义好劫持回调类 private class hijackWebChromeClient extends WebChromeClient {
public boolean hijack(String text) { if(text.equals('sdk:hello')) { System.out.println('hello world'); return true; } return false; } @Override public boolean onJsPrompt(WebView view, String message, String defaultValue, JSPromptResult result) { if(this.hijack(message)) { return true; } return super.onJsPrompt(view, url, message, defaultValue, result); } @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { if(this.hijack(message)) { return true; }
} @Override public boolean onJsConfirm(WebView view, String url, String message, JsResult result) { if(this.hijack(message)) { return true; }
} @Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
String message = consoleMessage.message(); if(this.hijack(message)) { return true; }
}
@Override
public void onConsoleMessage(String message, int lineNumber, String sourceID) { if(this.hijack(message)) { return true; } super.onConsoleMessage(message, lineNumber, sourceID);
}
} //注入劫持回调类 WebView webview = (WebView) findViewById(R.id.webview); webview.loadUrl('http://imnerd.org'); webview.setWebChromeClient(new hijackChromeClient);
webView.loadUrl("javascript:" + javaScriptString);
webView.evaluateJavascript(javaScriptString, new ValueCallback() {
@Override
public void onReceiveValue(String value) {
});