普通js和android的五种通信机制
- 使用弹出框形式诸如prompt,alert,confrm
//1. 在cordova中使用prompt进行js->native的通信,参见"cordova/android/promptbasednativeapi"模块
prompt(value, 'gap_bridge_mode:1');
//2. native基于WebChromeClient类拦截弹出信息(对应cordova android sdk SystemWebChromeClient.java)
@Override
public boolean onJsPrompt(WebView view, String origin, String message, String defaultValue, final JsPromptResult result) {
//defaultValue对应prompt参数2,origin位请求源(拿个域名下的网页)
return true;
}
2.让原生主动暴露对象 webview.addJavascriptInterface
class SystemExposedJsApi implements ExposedJsApi {
private final CordovaBridge bridge;
SystemExposedJsApi(CordovaBridge bridge) {
this.bridge = bridge;
}
@JavascriptInterface
public String exec(int bridgeSecret, String service, String action, String callbackId, String arguments) throws JSONException, IllegalAccessException {
return bridge.jsExec(bridgeSecret, service, action, callbackId, arguments);
}
@JavascriptInterface
public void setNativeToJsBridgeMode(int bridgeSecret, int value) throws IllegalAccessException {
bridge.jsSetNativeToJsBridgeMode(bridgeSecret, value);
}
@JavascriptInterface
public String retrieveJsMessages(int bridgeSecret, boolean fromOnlineEvent) throws IllegalAccessException {
return bridge.jsRetrieveJsMessages(bridgeSecret, fromOnlineEvent);
}
}
webView.addJavascriptInterface(new SystemExposedJsApi(bridge), "_cordovaNative");
window._cordovaNative.retrieveJsMessages()
参考例子 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0402/1105.html
3.通过调用webview.setNetworkAvailable(true)方法触发document online/offline事件
native:
webView.setNetworkAvailable(true);
js:
window.addEventListener('online', pollOnceFromOnlineEvent, false);
window.addEventListener('offline', pollOnceFromOnlineEvent, false);
注:在cordova中原生通过触发文档的online/offline事件,js端在online/offline事件触发时
再主动去调用原生暴露的API检索原生的中的变量来获取插件的执行结果
注:该种通信方式对应的是OnlineEventsBridgeMode ,可以在NativeToJsMessageQueue.java文件中找到
在SystemWebViewEngine.java init方法被添加
4. 使用webview.loadUrl("javascript:code")
该效果等同于在浏览器的地址栏当中输入"javascript:console.log('abc')"此时浏览器会以脚本的方式执行输入内容
可以以这种方式访问其他脚本中的其他变量,方法等
注:在cordova中native通过该种方式来将数据回传给js,对应的桥接模式(native和js通信方式)为LoadUrlBridgeMode
比如js中执行了如下方法
var callbacks = {}
function exec(callbackId,success,fail){
callbacks[callbackId] = {success:success,fail:fail}
}
function callbackFromNative(callbackId,successData,error){
if(successData){
callbacks[callbackId].success(successData)
}
if(error){
callbacks[callbackId].fail(error)
}
}
exec('123456',function(data){ console.log('success') },function(err){ console.log('fail')})
native中则可以通过以下方式将数据回传
webview.loadUrl("callbackFromNative('123456',{name:"zzz"},error)")
注:该种通信方式对应的是LoadUrlBridgeMode ,可以在NativeToJsMessageQueue.java文件中找到
在SystemWebViewEngine.java init方法被添加
5.基于webView.evaluateJavascript方式执行脚本
该方式类似于loadUrl,也是通过执行脚本来访问js
举例:
webview.evaluateJavascript("(function() { return 'this'; })();", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Log.d("LogName", s); // Prints: "this"
}
});
参数1为需要执行的脚本,参数1执行脚本返回的结果将做为参数2的参数
注:该种通信方式对应的是EvalBridgeMode ,可以在NativeToJsMessageQueue.java文件中找到
在SystemWebViewEngine.java init方法被添加