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

matlab/simulink saw谐振器仿真,基于Matlab的SAW模态耦合模型的仿真研究

第32卷 第 4 期Vol. 32 No. 4重 庆 理 工 大 学 学 报 (自然科学)Journal of Chongqing University of Technology( Natural Science)2 0 1 8年 4 月Apr. 2018doi : 10.3969/j . issn. 1674-8425(z). 2018.04.002本文引用格式 :李志鹏,马龙祥,孟旭,等•基...

weixin_36192634的博客 1385

一文搞定学术英语写作 (斯坦福SCI论文写作课程笔记)

0.前言: 本文基于斯坦福Kristin Sainani 教授的学术论文写作公开课——SCI论文写作(Writing in the Sciences)。在此基础上进行章节顺序的重排及部分内容的删减,以方便第一次进行英语学术论文写作的同学快速上手。 时间充足和想要系统学习英文学术写作的同学,十分建议观看完整课程视频,一定会受益匪浅!课程地址如下: 课程B站地址:https://www.bilibili.com/video/BV1zv41177JQ 1.论...

Ogmx的博客 3万+

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

学Simulink--基于多能源系统协同与能源互联网的电网系统场景实例:风光氢储一体化系统的能量管理与调度仿真

在全球“双碳”目标驱动下,高比例可再生能源并网成为电网发展的核心方向。然而,风电与光伏具有强随机性与间歇性,给电网稳定运行带来巨大挑战。风光氢储一体化系统(Wind-Solar-Hydrogen-Storage Integrated System)通过将可再生能源发电电解水制氢氢气储存与燃料电池发电有机结合,构建了一个长时储能与能量形态转换的闭环系统,是实现能源互联网与零碳电力系统的关键路径。✅平抑波动:氢储能可实现跨天、跨周储能✅能量转化:电→氢→电/热/交通燃料,实现多能互补✅长时储能。

amy_mhd的博客 1071

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

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

浮沉半生的博客 7902

windows在使用ping 127.0.0.1时出现一般故障的解决方案

本文主要介绍了windows在使用ping 127.0.0.1时出现一般故障的解决方案,希望能对使用windows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 6万+

Windows 11 WSL2环境下OpenClaw部署的兼容性问题分析与解决方案研究

本文研究了OpenClaw在Windows 11 WSL2环境下的部署方案。WSL2通过无缝集成Linux与Windows系统,为OpenClaw提供了良好的运行环境,支持GPU加速和跨平台开发。文章详细分析了硬件配置要求(推荐8核CPU/16GB内存/NVMe SSD)、系统选择(Windows 11 Pro+Ubuntu 22.04)以及部署步骤,包括WSL2启用、Linux发行版安装、Python/Node.js/Redis等依赖配置。通过优化.wslconfig文件参数(如内存分

博客 2279

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

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

weixin_39979489的博客 680

c#算法(5)—最小二乘法(二次曲线拟合)

最小二乘法——二次曲线拟合

qq_34059233的博客 1659

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

2025华为OD机试真题+全流程解析+备考攻略+面试技巧+机考经验分享+Java/python/JS/C++/C语言实现

本专栏包含华为 OD 机试最新的 A卷+B卷+C卷+D卷+E卷题库,为全网最全、最新题库,500+真题。每一篇文章都包含了题目描述、解题思路以及实现代码。同时免费提供最新的在线OJ 刷题系统。已有上百名小伙伴通过刷真题题库通过了华为od机考,拒绝一切形式的代考,替考行为!!!以下是本专栏详细内容介绍:本专栏提供在线OJ刷题系统:OJ题库OJ系统注册&使用教程:OJ使用教程其他专栏以及答疑介绍:50+ 高频面试手撕真题,已有上百位小伙伴高频认证。1:机试没过,半年的冷冻期。2:已经订阅过我专栏的同学,推荐新人

MISAYAONE的博客 2225

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

子孟的博客 2040

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android与前端交互之JSBridge

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

一杯清泉 6665

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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、付费专栏及课程。

余额充值