android和js的交互之jsbridge使用教程
前言
眾所周知,app的一些功能可能會使用到H5開發(fā),這就難免會遇到java與js 的相互調(diào)用,android 利用WebViewJavascriptBridge 實現(xiàn)js和java的交互,這里介紹下JsBridge第三方庫的使用。
github傳送門:https://github.com/lzyzsd/JsBridge (本地下載)
簡單分析
java與js相互調(diào)用如下:
java發(fā)送數(shù)據(jù)給js,js接收并回傳給java
同理,js發(fā)送數(shù)據(jù)給java,java接收并回傳給js
同時兩套流程都存在「默認接收」 與 「指定接收」
大致調(diào)用流程圖如下:


依賴
項目build.gradle
repositories {
// ...
maven { url "https://jitpack.io" }
}
app build.gradle
dependencies {
compile 'com.github.lzyzsd:jsbridge:1.0.4'
}
xml里直接使用com.github.lzyzsd.jsbridge.BridgeWebView替代原生WebView
另外放置兩個Button用于測試使用
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/java_to_js_default" android:layout_width="180dp" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="java發(fā)送給js默認接收" app:layout_constraintTop_toBottomOf="@+id/nav_bar" /> <Button android:id="@+id/java_to_js_spec" android:layout_width="180dp" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="java發(fā)送給js指定接收" app:layout_constraintTop_toBottomOf="@+id/java_to_js_default" /> <com.github.lzyzsd.jsbridge.BridgeWebView android:id="@+id/webView" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/java_to_js_spec" /> </android.support.constraint.ConstraintLayout>
html文件里簡單放置兩按鈕發(fā)送數(shù)據(jù),同時提供打印信息
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <button onClick="jsToJavaDefault()">js發(fā)送給java默認接收</button> </div> <br/> <div> <button onClick="jsToJavaSpec()">js發(fā)送給java指定接收</button> </div> <br/> <div id="show">打印信息</div> </body> </html>
這里我本地跑的一個簡單的django項目,起了個服務供使用
webView.loadUrl(http://10.0.0.142:8000/cake/jsbridge);
webview加載頁面

java發(fā)送數(shù)據(jù)給js
button注冊監(jiān)聽
javaToJsDefault.setOnClickListener(this); javaToJsSpec.setOnClickListener(this);
按鈕點擊事件,java傳遞數(shù)據(jù)給js
//java傳遞數(shù)據(jù)給js
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.java_to_js_default:
//默認接收
webView.send("發(fā)送數(shù)據(jù)給js默認接收", new CallBackFunction() {
@Override
public void onCallBack(String data) { //處理js回傳的數(shù)據(jù)
Toast.makeText(WebTestActivity.this, data, Toast.LENGTH_LONG).show();
}
});
break;
case R.id.java_to_js_spec:
//指定接收參數(shù) functionInJs
webView.callHandler("functionInJs", "發(fā)送數(shù)據(jù)給js指定接收", new CallBackFunction() {
@Override
public void onCallBack(String data) { //處理js回傳的數(shù)據(jù)
Toast.makeText(WebTestActivity.this, data, Toast.LENGTH_LONG).show();
}
});
break;
default:
break;
}
}
js WebViewJavascriptBridge注冊事件監(jiān)聽,接收數(shù)據(jù)
<script>
//注冊事件監(jiān)聽,初始化
function setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) {
callback(WebViewJavascriptBridge)
} else {
document.addEventListener(
'WebViewJavascriptBridgeReady'
, function() {
callback(WebViewJavascriptBridge)
},
false
);
}
}
//回調(diào)函數(shù),接收java發(fā)送來的數(shù)據(jù)
setupWebViewJavascriptBridge(function(bridge) {
//默認接收
bridge.init(function(message, responseCallback) {
document.getElementById("show").innerHTML = '默認接收到Java的數(shù)據(jù): ' + message;
var responseData = 'js默認接收完畢,并回傳數(shù)據(jù)給java';
responseCallback(responseData); //回傳數(shù)據(jù)給java
});
//指定接收,參數(shù)functionInJs 與java保持一致
bridge.registerHandler("functionInJs", function(data, responseCallback) {
document.getElementById("show").innerHTML = '指定接收到Java的數(shù)據(jù): ' + data;
var responseData = 'js指定接收完畢,并回傳數(shù)據(jù)給java';
responseCallback(responseData); //回傳數(shù)據(jù)給java
});
})
<script>
java發(fā)送給js默認接收

java發(fā)送給js指定接收

js發(fā)送數(shù)據(jù)給java
js按鈕點擊事件, 同時需要上面WebViewJavascriptBridge的注冊監(jiān)聽回調(diào)函數(shù)
//js傳遞數(shù)據(jù)給java
function jsToJavaDefault() {
var data = '發(fā)送數(shù)據(jù)給java默認接收';
window.WebViewJavascriptBridge.send(
data
, function(responseData) { //處理java回傳的數(shù)據(jù)
document.getElementById("show").innerHTML = responseData;
}
);
}
function jsToJavaSpec() {
var data='發(fā)送數(shù)據(jù)給java指定接收';
window.WebViewJavascriptBridge.callHandler(
'submitFromWeb' //指定接收參數(shù) submitFromWeb與java一致
,data
, function(responseData) { //處理java回傳的數(shù)據(jù)
document.getElementById("show").innerHTML = responseData;
}
);
}
java 監(jiān)聽接收數(shù)據(jù)
//默認接收
webView.setDefaultHandler(new BridgeHandler() {
@Override
public void handler(String data, CallBackFunction function) {
String msg = "默認接收到js的數(shù)據(jù):" + data;
Toast.makeText(WebTestActivity.this, msg, Toast.LENGTH_LONG).show();
function.onCallBack("java默認接收完畢,并回傳數(shù)據(jù)給js"); //回傳數(shù)據(jù)給js
}
});
//指定接收 submitFromWeb 與js保持一致
webView.registerHandler("submitFromWeb", new BridgeHandler() {
@Override
public void handler(String data, CallBackFunction function) {
String msg = "指定接收到js的數(shù)據(jù):" + data;
Toast.makeText(WebTestActivity.this, msg, Toast.LENGTH_LONG).show();
function.onCallBack("java指定接收完畢,并回傳數(shù)據(jù)給js"); //回傳數(shù)據(jù)給js
}
});
js發(fā)送給java默認接收

js發(fā)送給java指定接收

至此,jsBridge的使用流程完畢。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
android activity設置無標題實現(xiàn)全屏
本文將詳細介紹Android如何設置Activity全屏和無標題的實現(xiàn)方法,需要的朋友可以參考下2012-12-12
詳解Android應用開發(fā)中Intent的作用及使用方法
這篇文章主要介紹了Android應用開發(fā)中Intent的作用與用法,包括如何激活Activity組件與Intent的投遞等,需要的朋友可以參考下2016-03-03
Android中使用AsyncTask實現(xiàn)下載文件動態(tài)更新進度條功能
這篇文章主要介紹了AsyncTask用法解析-下載文件動態(tài)更新進度條,需要的朋友可以參考下2017-08-08

