You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在原生Android应用中监听WebView的JavaScript MessageEvent事件?

Android WebView捕获网页MessageEvent并调用原生方法

要在Android原生代码中捕获WebView加载的第三方网页触发的MessageEvent,核心思路是通过注入自定义JavaScript代码监听网页的message事件,再将事件数据传递给原生的Java/Kotlin方法。以下是具体实现步骤:

1. 配置WebView基础设置

首先启用WebView的JavaScript支持,并添加一个供JavaScript调用的原生接口:

Kotlin代码示例

val webView = findViewById<WebView>(R.id.webView)
webView.settings.apply {
    javaScriptEnabled = true
    domStorageEnabled = true // 部分网页需要DOM存储支持,按需开启
}

// 注册JavaScript接口,"MessageHandler"是JS中调用的对象标识
webView.addJavascriptInterface(MessageReceiver(), "MessageHandler")

实现原生接收类

创建一个类,用@JavascriptInterface注解标记供JS调用的方法(Android 4.2+必须添加该注解,防止安全漏洞):

class MessageReceiver {
    @JavascriptInterface
    fun onMessageReceived(eventJson: String) {
        // JS传递的MessageEvent会以JSON字符串形式传入
        // 切换到主线程处理UI操作(JS调用原生方法默认在后台线程)
        runOnUiThread {
            try {
                val eventObj = JSONObject(eventJson)
                val eventData = eventObj.getString("data")
                val eventOrigin = eventObj.getString("origin")
                
                // 这里执行你的原生逻辑,比如弹窗、调用其他方法
                Toast.makeText(applicationContext, "收到Message: $eventData", Toast.LENGTH_SHORT).show()
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
}

2. 注入JS代码监听MessageEvent

在网页加载完成后,注入自定义JS代码,监听网页的window.message事件,并将事件数据传递给原生接口:

webView.webViewClient = object : WebViewClient() {
    override fun onPageFinished(view: WebView?, url: String?) {
        super.onPageFinished(view, url)
        // 注入监听message事件的JS代码
        val injectScript = """
            window.addEventListener('message', function(event) {
                // 将MessageEvent对象转为JSON字符串,避免对象传递的兼容性问题
                var eventStr = JSON.stringify(event);
                // 调用原生注册的接口方法
                window.MessageHandler.onMessageReceived(eventStr);
            });
        """.trimIndent()
        view?.evaluateJavascript(injectScript, null)
    }
}

关键注意事项

  • 线程安全:JavaScript调用原生方法的线程是后台线程,若需要更新UI,必须通过runOnUiThread切换到主线程。
  • JSON解析:由于直接传递JavaScript对象存在兼容性问题,建议将MessageEvent转为JSON字符串后再传递,原生端通过JSONObject或Gson等工具解析。
  • 安全风险:避免在JavascriptInterface中暴露敏感方法,防止网页恶意调用;仅在必要时启用JavaScript支持。

内容的提问来源于stack exchange,提问作者GNova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:16:13