Skip to main content

· 4 min read

在 Android 开发中,从 WebView 的 H5 页面返回到原生页面,通常需要在 H5 页面中调用 Android 原生代码来实现。这需要结合 WebView 的 addJavascriptInterface 方法和 Android 原生代码进行桥接。

下面是详细的实现步骤:

1. 编写 Android 原生代码

首先,你需要创建一个 Java 或 Kotlin 类,用于提供 H5 页面可以调用的方法。这个类将作为 H5 和原生之间的桥梁。

MyJavaScriptInterface.kt (Kotlin)

class MyJavaScriptInterface(private val activity: Activity) {

@JavascriptInterface
fun goBackToNative() {
activity.runOnUiThread {
activity.finish() // 结束当前的 Activity,回到上一个原生页面
}
}
}

@JavascriptInterface 注解非常重要,它确保该方法可以被 JavaScript 访问。

2. 在 WebView 中设置接口

接下来,在你的 Activity 或 Fragment 中,加载 WebView 并将刚才创建的接口类添加到 WebView 中。

YourActivity.kt (Kotlin)

import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity

class YourActivity : AppCompatActivity() {

private lateinit var webView: WebView

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_your)

webView = findViewById(R.id.webView)

// 配置 WebView
webView.settings.javaScriptEnabled = true
webView.webViewClient = WebViewClient()

// 将原生接口注入到 WebView 中,"AndroidInterface" 是 H5 页面中用于调用的对象名
webView.addJavascriptInterface(MyJavaScriptInterface(this), "AndroidInterface")

// 加载 H5 页面
webView.loadUrl("file:///android_asset/your_h5_page.html")
// 或者 webView.loadUrl("https://your-website.com")
}
}

这里的 "AndroidInterface" 就是 H5 页面中用来调用原生方法的对象名。你可以根据需要自定义这个名称。

3. 在 H5 页面中调用原生方法

最后,在你的 H5 页面中,通过 JavaScript 来调用我们之前定义的 goBackToNative 方法。

your_h5_page.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>H5 页面</title>
</head>
<body>

<h1>欢迎来到 H5 页面</h1>
<p>点击下方按钮返回原生应用</p>

<button onclick="goBack()">返回原生</button>

<script>
function goBack() {
// 检查 AndroidInterface 对象是否存在,以避免在非 Android 环境下报错
if (typeof AndroidInterface !== 'undefined' && AndroidInterface.goBackToNative) {
AndroidInterface.goBackToNative(); // 调用原生方法
} else {
console.log("AndroidInterface 不存在或 goBackToNative 方法不可用");
// 可以在这里添加其他处理,比如关闭当前网页
window.close();
}
}
</script>

</body>
</html>

当用户在 H5 页面中点击 "返回原生" 按钮时,会执行 goBack() JavaScript 函数,然后调用 AndroidInterface.goBackToNative() 方法。这个调用会触发 Android 原生代码中的 activity.finish(),从而关闭当前的 WebView Activity,返回到上一个原生页面。

总结

整个流程可以概括为:

  1. Android 端:创建一个类,使用 @JavascriptInterface 注解暴露原生方法(例如 finish())。
  2. Android 端:通过 addJavascriptInterface 方法将这个类注入到 WebView 中,并指定一个名称(例如 AndroidInterface)。
  3. H5 端:在 JavaScript 中,使用这个指定的名称(AndroidInterface)来调用原生方法(例如 AndroidInterface.goBackToNative())。

· One min read
fengjutian

flutter_flip_card

alt text

提供翻转卡片动画的组件。可用于隐藏和显示产品的详细信息。

地址:https://github.com/imtheguna/flutter_flip_card

flutter_cool_card_swiper

alt text

带有平滑动画的酷炫Flutter Card Swiper

地址:https://github.com/MicroProgramers/flutter_cool_card_swiper

flash_card

alt text

支持创建Flash Cards的学习方法,使用户更容易记住信息。

地址:https://pub.dev/packages/flash_card

flutter_blue

alt text

用于连接和与Bluetooth低功耗设备通信的Flutter插件,在安卓和iOS上都可以使用。

地址:https://github.com/pauldemarco/flutter_blue

plus_plugins

Flutter Community Plus Plugins

地址:https://github.com/fluttercommunity/plus_plugins

· One min read
fengjutian

Hippy

alt text

Hippy 是 TDF 腾讯端框架(Tencent Device-oriented Framework)下前端开发友好的开源跨平台应用开发解决方案,可以使用 React 或者 Vue 来创建 Android 和 iOS 原生应用。

地址:https://openhippy.com/home

Kuikly

alt text

Kuikly是基于Kotlin MultiPlatform(KMP)构建的跨端开发框架。它利用了KMP逻辑跨平台的能力, 并抽象出通用的跨平台UI渲染接口,复用平台的UI组件,从而达到UI跨平台,具有轻量、高性能、可动态化等优点;同时,KuiklyBase基建同样支持逻辑跨端。

地址:https://kuikly.tds.qq.com/Introduction/arch.html

· One min read
fengjutian

Best-Flutter-UI-Templates

alt text

地址:https://github.com/mitesh77/Best-Flutter-UI-Templates

flutter-ui-nice

alt text

地址:https://github.com/FlutterOpen/flutter-ui-nice

flutter_vignettes

alt text

地址:https://github.com/gskinnerTeam/flutter_vignettes

Bruno

alt text

企业级 Flutter 组件,致力于打造移动端从产品设计到开发的一站式解决方案

地址:https://bruno.ke.com/

syncfusion_flutter_widgets

alt text

Syncfusion Flutter widgets libraries include high quality UI widgets and file-format packages to help you create rich, high-quality applications for iOS, Android, and web from a single code base.

地址:https://github.com/syncfusion/flutter-widgets/tree/master