近日需要做一个ANDROID 原生+H5插件化开发的项目,暂无头绪,先研究一下 Android DSBridge这个框架的使用,熟悉了再继续ANDROID 原生+H5插件化框架的开发
一、DSBridge 简介
DSBridge 是一款轻量级的跨平台 JavaScript 桥接框架,专为解决 H5 与原生(Android/iOS)双向通信而设计。相比传统 WebView 交互方案,它具备以下核心优势:
- 同步/异步双模式支持:原生与 H5 可实时传递数据
- 双向调用能力:H5 可调用原生方法,原生也可主动调用 H5 函数
- 零反射安全调用:规避传统 WebView 反射的安全风险
- 三端统一 API:Android/iOS/H5 使用相同调用规范
二、环境配置(Android Java)
1. 添加依赖
在项目的 build.gradle 中添加仓库和依赖(推荐最新版本):
repositories {
//一般用阿里云的仓库
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/central' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
mavenCentral()
maven { url "https://jitpack.io" }
google()
}
dependencies {
implementation 'com.github.wendux:DSBridge-Android:3.0.5'
//这个挺难下载的,建议直接到GITHUB中下载源码包含到项目中
//implementation project(':dsbridge') 我是用这种包含源码的方式
}
2. 配置 WebView
在布局文件 activity_main.xml 中声明 DSBridge 的专用 WebView:
三、基础交互示例
1. 原生暴露方法给 H5
创建 Java 接口类 JsApi.java:
import android.webkit.JavascriptInterface;
public class JsApi {
// 同步方法(直接返回结果)
@JavascriptInterface
public String syncMethod(String params) {
return "Java同步处理:" + params;
}
// 异步方法(通过CompletionHandler回调)
@JavascriptInterface
public void asyncMethod(String params, CompletionHandler handler) {
new Handler(Looper.getMainLooper()).postDelayed(() -> {
handler.complete("Java异步响应:" + params);
}, 1000); // 模拟延迟操作
}
}
在 MainActivity 中绑定接口:
public class MainActivity extends AppCompatActivity {
private DWebView dWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dWebView = findViewById(R.id.dwebview);
dWebView.addJavascriptObject(new JsApi(), "nativeObj"); // 绑定到H5的window.nativeObj
dWebView.loadUrl("file:///android_asset/demo.html");
}
}
2. H5 调用原生方法
创建 demo.html(存放在 src/main/assets):
<script src="dsbridge.js"></script>
<script>
// 同步调用示例
function callSync() {
let result = dsBridge.call("nativeObj.syncMethod", "Hello Java!");
alert("同步结果:" + result);
}
// 异步调用示例
function callAsync() {
dsBridge.call("nativeObj.asyncMethod", "Async Call", function(res) {
alert("异步结果:" + res);
});
}
</script>
3. 原生调用 H5 方法
在 H5 中注册方法:
// 注册H5方法供原生调用
dsBridge.register('h5Method', function(arg) {
return "H5收到参数:" + arg + ",处理完成!";
})
Java 端触发调用:
// 同步调用
String result = dWebView.callHandler("h5Method", "Java参数");
Log.d("DSBridge", result);
// 异步调用
dWebView.callHandler("h5Method", "Java参数", new OnReturnValue() {
@Override
public void onValue(String retValue) {
Log.d("DSBridge", "异步回调:" + retValue);
}
});
四、核心 API 详解
方法名 | 作用描述 |
addJavascriptObject | 将Java对象注入到JavaScript上下文 |
callHandler | 调用H5注册的方法 |
removeJavascriptObject | 移除已注册的Java对象 |
disableJavascriptDialog | 禁用WebView弹窗 |
五、常见问题排查
1. 方法调用无响应
- 检查方法是否添加 @JavascriptInterface 注解
- 确认H5调用路径格式为 对象名.方法名
- 确保已正确引入 dsbridge.js
2. 参数传递异常
- 复杂对象建议使用 JSON 字符串传递
- 原生端通过 JSONObject/JSONArray 解析
3. 异步回调未执行
- 确保 CompletionHandler 参数存在
- 避免在异步方法中直接操作 UI 线程
六、进阶实战技巧
1. 多模块通信
// 注册不同功能模块
dWebView.addJavascriptObject(new UserModule(), "user");
dWebView.addJavascriptObject(new DeviceModule(), "device");
2. 异常捕获机制
dWebView.setJavascriptExceptionHandler(e -> {
Log.e("JS Error", "JavaScript异常: " + e.getMessage());
});
3. 类型自动转换
支持以下数据类型双向转换:
- 基本类型(int/boolean等)
- String
- JSONObject
- JSONArray
- 自定义对象(需实现序列化)
七、最佳实践建议
- 命名规范化:使用驼峰命名法(如 user.getInfo)
- 参数校验:在方法入口处验证参数合法性
- 线程管理:异步操作需切换至子线程执行
- 版本兼容:通过 @Override 标注兼容方法
资源推荐
官方文档
示例工程
常见问题汇总
本文通过 Java 实现完整通信链路,读者可下载示例代码进行扩展开发。遇到技术问题欢迎在评论区交流