JS Bridge实现

var JSBridge = window.JSBridge || (window.JSBridge = {})

2.2 JS调用原生

关于JS如何主动调用原生,Android官方封装了接口。
首先需要创建JS访问原生的命名空间:
webView.addJavascriptInterface(this, "androidPlatform");
关于这个方法,官方给予了解释,

Injects the supplied Java object into this WebView. The object is injected into all frames of the web page, including all the iframes, using the supplied name.
将提供的Java对象注入到此WebView中。将提供的命名空间注入到网页的所有框架中,包括所有iframe。这允许从JavaScript访问Java对象的方法。

Android这边定义好命名空间后,JS就可以通过该命名空间传递数据给原生:

window.androidPlatform.postString(jsonStr); // 这样就将参数传给了原生的postString方法

2.3 Native接收JS传递过来的参数

在传给webView的Java对象中创建postString方法,接收JS传递的数据。

@JavascriptInterface // 从Android 4.2开始必须要加上该注解,postString方法才能被JS访问
public void postString(String jsonStr) {
// jsonStr就是JS传递过来的数据
}

2.4 Native返回数据给JS

Native如何返回数据给JS,Android的webView提供了方法。

final String script = “javascript:window.JSBridge.postMsg(” + data + “)”;
webView.evaluateJavascript(script, null));

2.5 JS接收原生传递过来的参数

// JS定义window,JSBridge.postMsg方法接收数据
JSBridge.postMsg = function postMsg(result) {
// 处理返回数据
}

2.6 回调事件处理

一般而言,JS调用原生方法,都希望得到返回数据。
所以JSBridge最好可以返回一个异步的Promise给调用者,等到原生返回数据后,通过该Promise接收到数据。

// 通过JSBridge.call调用原生
window.JSBridge.call(data).then();

// JSBridge.call()返回Promise
JSBridge.call = function (data) {
// 返回Promise
return new Promise(function (resolve, reject) {
JSBridge.callNative(data, {
resolve: resolve,
reject: reject
});
});
};

// 在这里执行真正的访问操作
// callbacks={} 缓存所有回调事件
JSBridge.callNative = function callNative(data, responseCallback) {
try {
var callbackId = ‘0’;
if (callbacks && typeof responseCallback.resolve === ‘function’) {
callbackId = ‘cb_’ + (uniqueId++) + ‘_’ + new Date().getTime(); // 生成唯一的callbackId
callbacks[callbackId] = responseCallback; // 保存回调事件
}
// 调原生
// 执行2.2的操作访问原生
} catch (e) {
console.error(e);
}
return null;
}

// 结束后,原生返回数据给JSBridge,参考 2.4 、 2.5
// 如果前端想要在then()里得到异步结果,还需要在 2.5 (JSBridge.postMsg)
// 中通过callbackId取回调事件执行
JSBridge.postMsg = function postMsg(result) {
// 处理返回数据
var call = callbacks[result.callbackId]; // callbackId需要全程“跟随”此次调用

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
*](https://bbs.csdn.net/topics/618165277)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值