【Android】混合开发 - JSBridge

205 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 7 天,点击查看活动详情

前言

如今混合开发,已经成为了很多公司的选择。特别是电商平台,因为存在大量的活动,如果只是使用传统的开发方式,将无法满足及时更新应用,来推广活动。而此时混合开发就可以发挥其优势了。

所谓的混合开发,就是原生 Android + web(H5) 混合开发。 那么其核心点就是。如何在两者之间搭起沟通的桥梁。

学习一个新的事物,总是容易毫无头绪去,就应该以建立 问题树 的方式,开展学习。问题树往往比知识树更容易让人掌握一个知识。

那么我们通过以下几个问题,来尝试打开我们的混合开发之路吧。

问题树

WebView 怎么加载 H5?

如果我们希望在我们的 App 上简单地加载出一个网址的内容。那么我们可以通过 WebView 的 loadUrl 的方法实现。

webView.loadUrl("https://juejin.cn/user/2664871915426669")

Android 如何调用 H5 中的方法?

如果要想调用H5中的方法,那么我们要通过 WebSettings 配置 JavaScriptEnabled 的属性

webSettings = webView.settings
webSettings.javaScriptEnabled = true

当我们这么写完之后,会发现这个方法已经被 deprecated 了。至于为什么呢?是因为在 Android 4.2 之前的版本存在安全性漏洞问题,容易被恶性攻击。在 Android 4.2 以后的版本,Google 已通过 @JavaScriptInterface 解决了有关问题。

调用又分为 3 种情况,1.无需返回值的 2.需要返回值的 3.需要传参的。接下来我们一一来看一下,具体如何实现?

调用无返回值的方法

wv_test.loadUrl("JavaScript:show()") //show() 是 js 里面的方法名字

调用有返回值的方法

/******************evaluateJavascript 源码****************************/
/**
* @param script
* @param resultCallback 返回回调,返回值为 String 类型(可以是json格式数据)
*/
public void evaluateJavascript(@NonNull String script,
     @Nullable ValueCallback<String> resultCallback) {
    throw new RuntimeException("Stub!");
}

/******************Android 中具体使用****************************/
//Android 中具体使用
wv_test.evaluateJavascript("sum(1,2)" ) { value ->
    Log.e(TAG,"onReceiveValue value=$value")
}

/*******************JS 中的代码*********************************/
//JS 中的代码
function sum(a,b){
return a+b;
}

调用需要传参的方法

//如果参数是一个常量
wv_test.loadUrl("javascript:func('param')")
//如果参数是一个动态值,请使用转移字符
wv_test.loadUrl("javascript:func(""param"")")

H5 如何调用 Android 中的方法?

一开始的想法,就是 H5 端直接调用我有关的方法就好了,我也是怎么调用对方的方法的。

但,实际过程中,需要我们打开一个通信的通道——addJavascriptInterface 的方式打开这个通道,H5 端才能正常调用我们实现的方法。

wv_test.addJavascriptInterface(JsInter(),"Android")

那上面的两个参数 JsInter 和 Android 又是什么呢?

参数1:JsInter

JsInter 是一个类,主要实现了提供给 H5 调用的方法。

class JsInter { @JavascriptInterface fun back(): String { return "hello QCoder" } }

参数2:Android

"Android" 这个值,就是上面类的别名,让 H5 那边可以通过 这个别名来调用我们的方法。

//Android 就是别名, back就是我们提供的方法。
window.Android.back();

结语

上面的就完成了原生 Android 和 H5 之间的通讯了。但,这只是混合开发的基础,真正的难题还在后面的更深的技术和更繁琐的业务情况。