JSBridge实现Android和H5交互

移动端h5与原生交互JSBridge初体验 1.移动端判断终端 const ua = window.navigator.userAgent.toLowerCase() // android平台 const isAndroid = (() => { return /Android|Adr/i.test(ua) })() // ios平台 const isIos = (() => { return /iPhone|iPod|iPad/i.test(ua) })() // 微信生态 const isWechat = (() = 阅读详情

前言

相比于WebView的自带的JavascriptInterface的接口,使用JSBridge实现Android和H5之间的交互会更加方便和安全,接下来介绍一下JSBridge的具体用法。

添加JSBridge库

在Android Studio的app/build.gradle添加如下配置,即可完成JSBridge库导入:

repositories {
	maven { url "https://jitpack.io" }
}

dependencies {
	implementation 'com.github.lzyzsd:jsbridge:1.0.4'
}

代码实现

接下来通过示例代码演示如何实现JS和Android之间的交互,需要完整项目文件通过如下链接下载:
https://download.youkuaiyun.com/download/Jason_Flash/12883161

AndroidManifest.xml

AndroidManifest.xml需要加入INTERNET权限:

<uses-permission android:name="android.permission.INTERNET" />

activity_main.xml

在activity_main.xml添加JSBridge的webView:

<com.github.lzyzsd.jsbridge.BridgeWebView
        android:id="@+id/activity_web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

javascript.html

创建assets目录,并在assets目录下添加JS文件,这里命名为javascript.html。在javascript.html注册供Android调用的方法,并在点击按钮时调用Android注册的方法,实现交互,具体代码如下(实际项目中H5页面往往部署在服务器上,这个使用本地JS文件方便测试):

<html>
    <head>
        <meta content="text/html; charset=utf-8" http-equiv="content-type">
        <title>JSBridge测试</title>
        <script>

            //注册事件监听
            function connectWebViewJavascriptBridge(callback) {
                if(window.WebViewJavascriptBridge) {
                    callback(WebViewJavascriptBridge);
                } else {
                    document.addEventListener (
                        "WebViewJavascriptBridgeReady",
                        function() {
                            callback(WebViewJavascriptBridge);
                        },
                        false
                    );
                }
            }

            connectWebViewJavascriptBridge(function(bridge) {
                //注册回调函数,接收Android端用send方法发送的消息
                bridge.init(function(message, responseCallback) {
                    alert("message from Java = " + message);
                    var responseData = "Received!";
                    responseCallback(responseData);
                });

                //注册回调函数,供Android调用,接收Android端发送的数据
                bridge.registerHandler("functionInJs", function(data, responseCallback) {
                    alert("data from Java = " + data);
                    var responseData = "Received!";
                    responseCallback(responseData);
                });
            })

            function queryInfo(key) {
                //调用Android端注册的getInformation方法进行数据查询
                window.WebViewJavascriptBridge.callHandler("getInfomation", key,
                function(responseData) {
                    alert("responseData from Java = " + responseData);
                });
            }

            function control(key) {
                //调用Android端注册的controlDevice方法进行设备状态控制
                window.WebViewJavascriptBridge.callHandler("controlDevice", key,
                function(responseData) {
                    alert("responseData from Java = " + responseData);
                });
            }

            function sendMessage(message) {
                //通过send方法向Android发送消息
                window.WebViewJavascriptBridge.send(message, function(responseData) {
                    alert("responseData from Java = " + responseData);
                });
            }

        </script>
    </head>

    <body>
        <p>JSBridge测试</p>
        <p><input type="button" value="查询设备类型" onclick='queryInfo("deviceType");'/></p>
        <p><input type="button" value="查询设备状态" onclick='queryInfo("deviceStatus");'/></p>
        <p><input type="button" value="打开设备" onclick='control("open");'/></p>
        <p><input type="button" value="关闭设备" onclick='control("close");'/></p>
        <p><input type="button" value="发送消息" onclick='sendMessage("Hello Android!");'/></p>
    </body>
</html>

MainActivity.java

在MainActivity.java中加载创建好的javascript.html,注册供JS调用的方法,并在启动时调用JS注册的方法发送消息和数据:

package com.example.testjsbridge;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.webkit.WebChromeClient;

import com.github.lzyzsd.jsbridge.BridgeHandler;
import com.github.lzyzsd.jsbridge.BridgeWebView;
import com.github.lzyzsd.jsbridge.BridgeWebViewClient;
import com.github.lzyzsd.jsbridge.CallBackFunction;
import com.github.lzyzsd.jsbridge.DefaultHandler;

public class MainActivity extends Activity {

    BridgeWebView mWebView;
    String deviceType = "插座";
    boolean deviceStatus = false;
    String myData = "{data,1234567890}";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mWebView = (BridgeWebView) findViewById(R.id.activity_web_view);

        initWebView();
    }

    private void initWebView() {
        mWebView.setWebViewClient(new MyWebViewClient(mWebView));
        mWebView.setDefaultHandler(new MyHandlerCallback());
        mWebView.setWebChromeClient(new WebChromeClient());
        //开启webView的LocalStorage功能,使H5可以保存数据
        mWebView.getSettings().setDomStorageEnabled(true);
        //加载本地JS文件,实际项目中加载H5页面的url
        mWebView.loadUrl("file:///android_asset/javascript.html");

        //注册获取信息方法,供JS调用
        mWebView.registerHandler("getInfomation", new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {

                String responseData = "";
                Log.d("TestJsBridgeLog", "data from JS: " + data);
                if(data.contentEquals("deviceStatus")) {
                    if(deviceStatus) {
                        responseData = "开";
                    } else {
                        responseData = "关";
                    }
                } else if(data.contentEquals("deviceType")) {
                    responseData = deviceType;
                }
                //回调返回给JS
                function.onCallBack(responseData);
            }
        });

        //注册控制设备状态方法,供JS调用
        mWebView.registerHandler("controlDevice", new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {

                String responseData = "";
                Log.d("TestJsBridgeLog", "data from JS: " + data);
                if(data.contentEquals("open")) {
                    deviceStatus = true;
                    responseData = "打开设备成功";
                } else if (data.contentEquals("close")){
                    deviceStatus = false;
                    responseData = "关闭设备成功";
                } else {
                    responseData = "参数错误";
                }
                //回调返回给JS
                function.onCallBack(responseData);
            }
        });

        //调用send方法向JS发送消息
        mWebView.send("Hello JS!");

        //webView调用JS的方法发送数据
        mWebView.callHandler("functionInJs", myData, new CallBackFunction() {
            @Override
            public void onCallBack(String responseData) {
                //打印JS回复的消息
                Log.d("TestJsBridgeLog", "responseData from JS: " + responseData);
            }
        });

    }

    class MyWebViewClient extends BridgeWebViewClient {

        public MyWebViewClient(BridgeWebView webView) {
            super(webView);
        }

		//每次页面加载完成时,获取H5页面的title,可以根据项目需要使用
		@Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            String title = view.getTitle();
            if (!TextUtils.isEmpty(title)) {
                log("onPageFinished title:" + title);
            }
        }
    }

    //接收JS通过send方法发送的消息
    class MyHandlerCallback extends DefaultHandler {
        @Override
        public void handler(String data, CallBackFunction function) {
            super.handler(data, function);
            if (null != function) {
                Log.d("TestJsBridgeLog", "data from JS: " + data);
                function.onCallBack("收到JS消息");
            }
        }
    }

	//右滑时,返回上一个H5页面,H5页面多次跳转的项目中使用
	@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

效果图

在这里插入图片描述

android 与 h5 交互 现代的移动应用几乎都是原生和h5混合开放,这样既保证了用户体验,又使得APP在一定程度上具备动态更新能力,同时有利于实现跨平台开发,减少人力成本。混合开发自然避免不了app与h5的交互。今天我们就来谈谈android 和 h5 的交互。 ... 阅读详情

相关推荐

JSBridge 详解:如何实现移动端与 H5 的高效交互?

本文旨在为开发者提供关于 JSBridge 技术的全面指南,涵盖从基础原理到高级优化的所有关键方面。JSBridge 的核心通信机制iOS 和 Android 平台的实现差异性能优化策略安全防护措施实际应用案例分析文章首先介绍 JSBridge 的基本概念,然后深入探讨其实现原理,接着提供详细的代码示例和优化策略,最后讨论实际应用和未来发展趋势。JSBridge: 连接 JavaScript 和原生代码的桥梁技术WebView: 用于在应用中嵌入网页的组件Hybrid App。

移动开发前沿的博客 1243

使用JSBridge框架来实现Android与H5(JS)交互

在开发中,为了追求开发的效率以及移植的便利性,一些展示性强的页面我们会偏向于使用h5来完成,功能性强的页面我们会偏向于使用native来完成,而一旦使用了h5,为了在h5中尽可能的得到native的体验,我们native层需要暴露一些方法给js调用,比如,弹Toast提醒,弹Dialog,分享等等,有时候甚至把h5的网络请求放到native去完成。JSBridge做得好的一个典型就是微信,微信给开发者提供了JS SDK,该SDK中暴露了很多微信native层的方法,比如支付,定位等。

UrasakiNakajima的博客 4723

h5-jsbridge:Javascript桥androidios webview

H5-JSBridge Javascript bridge / webview Install npm install h5-jsbridge --save Use import JsBridge from 'h5-jsbridge' /** * 函数描述:js注册方法给app调用 * * jsBridge.registerHandler(name, callback(data, appCallback)) * @param {String} name 方法名 * @param {Function} callback 回调函数 * @param {Any} callback.data app返回的数据 * @param {Function} callback.appCallback app返回的回调 * @return */ JsBridge.registerHandle

JSBridge原理 - 前端H5与客户端Native交互

JSBridge在混合应用开发中扮演着至关重要的角色,它作为Web页面与原生应用之间的通信桥梁,实现了两者之间的双向通信。通过JSBridge,开发者可以充分利用Web技术的跨平台性和原生应用的性能优势,打造功能丰富、性能卓越的应用。在混合应用开发中,JSBridge的重要性不言而喻,它不仅是Web页面与原生应用之间的通信桥梁,更是提升应用性能和用户体验的关键。

专注于全栈开发领域 4136

【AI+教育】别再让 Cursor 只当编辑器了!4 步解锁 Claude 官方技能!

本文介绍了在Windows环境下通过OpenSkills工具在Cursor中调用Claude AI技能的方法。主要内容包括:1)安装Node.js环境;2)全局安装OpenSkills工具;3)安装Claude官方技能库;4)通过AGENTS.md文件同步技能;5)在Cursor中直接调用技能完成Excel、PPT等任务。文章提供了详细的操作步骤和示例,帮助用户快速上手使用AI技能提升工作效率。

奶爸的编程之路,也就一周冷个三天 751

基于WEKWS模型的语音唤醒关键词识别

本文所使用的模型网络结构继承自论文《Compact Feedforward Sequential Memory Networks for Small-footprint Keyword Spotting》,文中研究了将低秩矩阵分解与传统FSMN相结合的紧凑型前馈顺序记忆网络(cFSMN)用于远场关键字检测任务。

YuZhou的博客 6596

Android集成JsBridge实现与H5的交互

Android项目集成JsBridge的两种方式 方式一:通过在app的build.gradle中添加依赖 repositories { // ... maven { url "https://jitpack.io" } } dependencies { implementation 'com.github.lzyzsd:jsbridge:1.0.4' } xml文件当中使用 <?xml version="1.0" encoding="utf-8"?> &l

博客,是nsacer先森的 1560

物理小白也能懂的PINN指南:用Python给神经网络注入‘物理常识‘

本文为物理小白提供了一份通俗易懂的PINN入门指南。通过生活化类比和Python实战,详细讲解了如何将物理定律作为约束注入神经网络,使其具备“物理常识”,从而在数据稀缺时也能做出符合规律的预测。文章以热传导方程为例,手把手教你从零构建物理信息神经网络。

open4的博客 349

使用 JSBridge 与原生 IOS、Android 进行交互(含 H5、Android、IOS 端代码,附 Demo)

本文详细讲述了如何使用 JSBridge 在 H5 和原生 Android、IOS之间进行交互。IOS 端包含 OC 和 Swift 的版本,Android 端包含 Java 和 Kotlin 版本。

浮沉半生的博客 7902

保姆级避坑指南:在Ubuntu 22.04上用ROS2 Humble搞定TurtleBot3的SLAM与导航(附5个常见报错解决方案)

本文提供了一份详细的Ubuntu 22.04上使用ROS2 Humble和TurtleBot3进行SLAM建图与导航的避坑指南,涵盖Gazebo启动失败、场景加载问题、环境变量设置、GLIBCXX版本冲突及Nav2参数配置等5个常见报错的解决方案,帮助开发者高效完成机器人导航项目。

weixin_29062823的博客 285

Fedproto:原型聚合的联邦学习框架

文中说明,联邦学习通过计算传递梯度聚合模型时,客户端之间的异构性通常会阻碍模型优化收敛和泛化性能。故本文提出新的FedProto框架,将梯度替换成为原型,通过计算、聚合从不同客户端收集到的本地原型,然后将全局原型发送回所有客户端,以规范本地模型的训练。对每个客户机进行局部训练的目的是最小化对本地数据的分类损失,同时保持生成的本地原型足够接近相应的全局原型(损失函数最小+正则)。什么是原型?文中提到:“

weixin_47754029的博客 2649

h5中嵌入android页面,android&ios内嵌H5页面使用jsbridge实例

1、使用vue.js框架搭建前段项目页面 在main.js中初始化 WebViewJavascriptBridge 对象,WebViewJavascriptBridge 是app端定义的,在前端页面中获取 获取过程需要等待 , 所以vue实例的创建要在WebViewJavascriptBridge 获取成功之后,因为我的vue入口页面用到了jsbridge方法调用app端的数据获取header信...

weixin_39979489的博客 680

别再瞎试了!用Python+正交设计,5分钟搞定你的多因素实验方案

本文介绍了如何利用Python和正交设计高效优化多因素实验方案。正交设计通过精心设计的正交表,用最少的实验次数覆盖所有因素的水平组合,显著提升实验效率。文章详细讲解了正交设计的核心优势、Python实现工具链、实验实施与数据分析方法,以及高级技巧与常见问题解决方案,帮助读者快速掌握这一强大的实验优化技术。

weixin_42526087的博客 333

android h5 js find函数,GitHub - scofieldfan/turtle-jsbridge: h5和Android调用的一些原理和基础函数。JSBridge原理...

Hybrid 方案原理 安卓 WebView 和 h5 的交互原理(JSBridge 原理)列举了 JSBridge 的几种内部实现逻辑。可以编译工程看代码实际运行效果如下这是首页的运行效果这是 prompt 的运行效果这是 Android 端收到的日志安卓调用 JSWebView 的 loadUrlmWebView.loadUrl("javascript:callJS()");这个方法无法拿到返...

weixin_36165880的博客 216

【OpenClaw从入门到精通】第15篇:国产芯片适配实战——昇腾/龙芯/天数智芯全流程跑通(2026实测版)

2026年国产芯片AI适配迎来爆发期,OpenClaw作为轻量化本地AI智能体,已实现华为昇腾、龙芯、天数智芯等主流国产平台的全流程适配。本文基于实测数据,从背景解析、核心原理、算法优化、实操部署四个维度,详细讲解OpenClaw在香橙派昇腾开发板、龙芯3B6000M、天数彤央TY1200及联想开天X7h的部署流程,同时提供统一工具玄武CLI的使用指南。文中包含完整代码、执行结果、避坑技巧及虚拟实战案例,兼顾新手入门与进阶提升,帮助读者快速掌握国产芯片上的本地AI部署能力,实现数据隐私保护与低成本AI落地。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1006

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android JSBridge实现Java与H5交互详细使用

前情: Android控件WebView的自带的JavascriptInterface的接口,可以简单实现Java与js的交互,但是局限性很大。所以就出现了第三方库JSBridge。JSBridge实现了Java与javascript之间数据互通,Java调用js代码,js调用Java代码。 集成JSBridge库 可以查看该库的GitHub简述 集成方法两种: ...

子孟的博客 2040

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android与前端交互之JSBridge

    在app中,经常会遇到一些活动推广的页面,大多数活动具备时效性强、运营时间短的特征,这些活动一般都是通过H5页面快速投放到产品的活动模块,来和用户进行交互。如何建立web页面和本地Native页面的深度交互,这就接下来要重点介绍的JSBridge,先看一个效果图:图一JS调用Android,图二Android调用JS。Android调用JS    在android为我们提供了WebView...

一杯清泉 6665

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android native和H5交互——JsBridge以及websettings详细说明

native和H5互调什么是JSBridge?JSBridge具体用法? 什么是JSBridge? JSBridge 是native和H5 之间的桥梁,它的核心是构建 Native 和非 Native 间消息通信的通道,而且这个通信的通道是双向的。 下面我将自己学习到的jsbridge的用法简单的梳理一下。 JSBridge具体用法? 1、先导入依赖 implementation 'com.github.lzyzsd:jsbridge:1.0.4' 2、创建一个HomeActivity,其

weixin_45552475的博客 1067

webview与H5 交互

implementation 'com.github.lzyzsd:jsbridge:1.0.4' H5调android webview.registerHandler("方法名", new BridgeHandler() { @Override public void handler(String data, CallB...

ydc0128的博客 591

全面解析 iOS 和 Android 内嵌 H5 页面通信与交互实现方案

在移动应用中,H5 页面与 App 的通信是常见需求。本文介绍了 iOS 和 Android 的通信方式。在 iOS,H5 页面通过 window.webkit.messageHandlers 调用原生方法,iOS 端使用 WKScriptMessageHandler 处理消息;在 Android,JavascriptInterface 允许 H5 调用原生方法,并通过 evaluateJavascript 执行 JS。JSBridge 作为跨平台桥接,帮助 H5 与 App 双向交互常用于登录、支付等场静

qq_40791475的博客 5734

H5与App之间的交互处理

一、H5与App之间的一些简单交互(H5主动调用app的方法) 第一种方法,H5这边只需要调用window里面app注册好的方法,就可以 function getAppMethods(anz, ios, data = null) { // 判断用户为 iOS 还是 Android (device) let u = navigator.userAgent let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') >

渣渣宇的博客 2139

android webview jsbridge互调的使用

简介 最近项目当中用到了jsbridge框架,于是先记录一下android调用h5和h5调用android的使用方法。 github地址是jsbridge 当我们遇到bug或者坑的时候别慌,先去github上的issues上浏览一遍再说,因为这种star数很多的,肯定有人已经遇到过坑了。 android调用js BridgeWebview.send(jsFunc...

北京流年 1123

jsBridge H5和原生交互

jsBridge 方式1: js调用原生约定方法名encyclopedia 注意需要判断设备类型 然后调用方法如下 ios:window.webkit.messageHandlers.encyclopedia.postMessage({}); android:window.android.encyclopedia(); 原生调用js 方法 window.testBridge = fun...

weixin_40404336的博客 1309

jsbridge实现及原理_jsBridge原理解析

导语现在大多数App与H5的交互越来越多,jsBridge是一个能使webView和js交互的通信方式,本文只对https://github.com/lzyzsd/JsBridge(以下涉及到的jsBridge源码都是出自这个框架)进行分析,只要你懂得了其中的原理,你也可以封装一个jsBridge。不过在介绍jsBridge的原理前,我会简单介绍下原始的webView与js交互以及为什么要用jsB...

weixin_33532301的博客 3201

android与h5交互设计,H5与native交互之JSBridge

JSBridge1. Why do we need JSBridge?2. Why is “JS”Bridge?3. What is JSBridge?Why do we need JSBridge?背景随着HTML5的不断普及及优化,其在移动端开发的应用也越来越多。why?H5是跨平台的依托浏览器运行,不用区分ios或者安卓去做不同的版本的开发,这样可以节约开发成本。当然在ios和安卓各种...

weixin_35235724的博客 654
上一篇: Allatori混淆jar包后同时存在大小写类名解决
下一篇: Android反编译工具使用方法
Jason_Flash
博客等级 码龄7年 1万+粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值