混合开发-JSBridge

news2024/11/14 16:22:55

1.1 什么是混合开发?

混合开发是一种融合了原生开发Web开发优势的移动应用开发方式

具体来说,混合开发通常指的是利用一种框架或平台来创建应用程序,这种程序结合了原生应用的一些功能和特性(比如访问设备的摄像头、相册、GPS、蓝牙等),并且使用Web技术(HTML5、CSS和JavaScript)来编写大部分的应用代码。

1.2 混合开发优势

混合开发在跨平台能力、性能、开发效率、更新、离线运行、业务灵活性等方面都有显著优势,这些优势使混合开发成为许多开发者和企业的首选开发模式。

  1. 跨平台能力:混合开发的一个主要优点是可以编写一次代码,然后部署到多个平台(如iOS/Android/HarmonyOS),这大大节省了开发和维护成本。
  2. 快速迭代:由于混合应用主要使用Web技术,因此它们可以像网页一样进行快速更新和迭代,无需用户手动更新应用。
  3. 用户体验:虽然混合应用在性能上可能不如完全的原生应用,但随着技术的发展,许多混合开发框架已经能够提供接近原生应用的用户体验。
  4. 成本效益:对于预算有限的项目或初创公司来说,混合开发是一个成本效益较高的选择,因为它减少了为每个平台单独开发应用的需要。

设置加载进度条

 // 网页是否在加载中
 @State loading: boolean = true
 // 网页加载的进度
 @State progress: number = 0

// ....

// 堆叠组件
  Stack({ alignContent: Alignment.Top }){
    // 如果加载中, 则显示进度条插件
    if (this.loading) {
      Progress({ type: ProgressType.Linear, value: this.progress, total: 100 })
        .style({ strokeWidth: 2, enableSmoothEffect: true })
        .color($r('app.color.red'))
        .zIndex(1)
    }
  }
  .width('100%')
  .layoutWeight(1)

 设置Web组件加载网页

src: ResourceStr = 'https://m.suning.com'  // 加载的页面地址
// ...
// 网页加载的进度
@State progress: number = 0
// 页面视图控制器
controller = new webview.WebviewController()

// ...

// 堆叠组件
Stack({ alignContent: Alignment.Top }){
  // 如果加载中, 则显示进度条插件
  if (this.loading) {
    Progress({ type: ProgressType.Linear, value: this.progress, total: 100 })
      .style({ strokeWidth: 2, enableSmoothEffect: true })
      .color($r('app.color.red'))
      .zIndex(1)
  }

  // web组件: 用于加载在线网页
  Web({ src: this.src, controller: this.controller })
}
.width('100%')
.layoutWeight(1)
  1. 设置进度条 显示/隐藏 和 加载进度

onPageBegin: 开始加载网页时触发

onPageEnd: 网页加载完成时触发

onProgressChange: 网页加载进度变化时触发该回调

// web组件: 用于加载在线网页
Web({ src: this.src, controller: this.controller })
  // 网页加载进度变化时触发该回调
  .onProgressChange((data) => { 
    // 1. 进度条
    console.log('mk-logger', JSON.stringify(data)) // 新的加载进度,取值范围为0到100的整数
    if (data) {
      // 1.1 记录加载进度
      this.progress = data.newProgress
      // 1.2 如果加载进度完成
      if (data.newProgress === 100) {
        // 1.3 动画让进度条消失
        animateTo({ duration: 300, delay: 300 }, () => {
          this.loading = false
        })
      }
    }
  })
  // 开始加载网页时触发
  .onPageBegin(() => { 
    this.progress = 0
    this.loading = true
    console.log('mk-logger', 'onPageBegin')
  })
  // 网页加载完成时触发
  .onPageEnd(() => { 
    console.log('mk-logger', 'onPageEnd')
  })

导航栏相关操作处理

 1.导航左侧处理

 

返回处理(最左边返回按钮): 在webview中, 如果当前网站页面之前有页面则控制器内返回上一个网页的页面, 如果没有则原生侧路由返回

关闭处理(左边第二个x号按钮): 原生侧路由返回,直接回到App的上一个页面

// ...
// 加载网页页面完成时触发该回调,用于应用更新其访问的历史链接
.onRefreshAccessedHistory(() => { 
  const history = this.controller.getBackForwardEntries()  // 获取当前Webview的历史信息列表
  this.historyCurrIndex = history.currentIndex  // 当前在页面历史列表中的索引
  this.historySize = history.size  // 历史列表中索引的数量,最多保存50条,超过时起始记录会被覆盖
  // AlertDialog.show({message: this.historyCurrIndex + '-' + this.historySize })
 })
  webBack() {
    // 如果在web容器中, 当前页面之前还有页面, 则容器内返回上一页
    if (this.historyCurrIndex > 0) {
      this.controller.backward()
    } else {
      router.back()
    }
  }

  webClose() {
    router.back()
  }

 2.导航下拉菜单-刷新

 @Builder
  MenuBuilder() {
    Menu() {
      MenuItem({ content: '首页' })
        .onClick(() => router.back({ url: 'pages/Index', params: { index: 0 } }))
      MenuItem({ content: '分类' })
        .onClick(() => router.back({ url: 'pages/Index', params: { index: 1 } }))
      MenuItem({ content: '购物袋' })
        .onClick(() => router.back({ url: 'pages/Index', params: { index: 2 } }))
      MenuItem({ content: '我的' })
        .onClick(() => router.back({ url: 'pages/Index', params: { index: 3 } }))
      MenuItem({ content: '刷新一下' })
         //利用Webview控制器的refresh方法刷新页面
        .onClick(() => this.controller.refresh())
    }
    .width(100)
    .fontColor($r('app.color.text'))
    .font({ size: 14 })
    .radius(4)
  }

 3.导航条标题设置

// 网页document标题更改时触发该回调
.onTitleReceive((data) => { 
  console.log('mk-logger', 'onTitleReceive')
  this.title = data?.title || ''
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel 冻结多行多列

背景 版本:office 2021 专业版 无法像下图内某些版本一样,识别选中框选的多行多列。 如下选中后毫无反应,点击【视图】->【冻结窗口】->【冻结窗格】后自动设置为冻结第一列。 操作 如下,要把前两排冻结起来。 选择 C1&a…

华为OD机试 - 信号强度(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

网站渗透这块水太深,你把握不住!但你叔我能(十年经验分享)

很多朋友问我,想搞网络安全,编程重要吗,选什么语言呢? 国内其实正经开设网络安全专业的学校很少,大部分同学是来自计算机科学、网络工程、软件工程专业的,甚至很多非计算机专业自学的。因此不像这三个专业…

【技术文章】ArcGIS Pro如何批量导出符号和工程样式?

目录 1.确定Pro软件版本 2.共享工程样式 3.管理和调用项目样式 制作好的地图,如何快速分享地图中的符号样式用于其它地图的制作? 在ArcMap软件中,可以通过命令一键批量导出所有符号。ArcGIS Pro软件是否也可以批量导出符号用于其它地图…

Java-数据结构-排序-(一) (。・ω・。)

文本目录: ❄️一、排序的概念及引用: ➷ 排序的概念: ➷ 常见的排序算法: ❄️二、插入排序的实现: ➷ 1、直接插入排序: ☞ 直接插入排序的基本思想: ☞ 直接插入排序的实现: ▶…

UI自动化测试(python)Web端4.0

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

PyCharm与Anaconda超详细安装配置教程

1、安装Anaconda(过程)-CSDN博客 2.创建虚拟环境conda create -n pytorch20 python3.9并输入conda activate pytorch20进入 3.更改镜像源conda/pip(只添加三个pip源和conda源即可) 4.安装PyTorch(CPU版) 5.安装Pycharm并破解&…

使用 Anaconda 环境在Jupyter和PyCharm 中进行开发

目录 前言 一、在特定环境中使用jupyter 1. 列出所有环境 2. 激活环境 3. 进入 Jupyter Notebook 二、在特定环境中使用pycham 1. 打开 PyCharm 2. 打开设置 3. 配置项目解释器 4. 选择 Conda 环境 5. 应用设置 6. 安装所需库(如果需要) 总结 &#x1f3…

2024年中国研究生数学建模竞赛C题——解题思路

2024年中国研究生数学建模竞赛C题——解题思路 数据驱动下磁性元件的磁芯损耗建模——解决思路 二、问题描述 为解决磁性元件磁芯材料损耗精确计算问题,通过实测磁性元件在给定工况(不同温度、频率、磁通密度)下磁芯材料损耗的数据&#xf…

卡西欧相机SD卡格式化后数据恢复指南

在数字摄影时代,卡西欧相机以其卓越的性能和便携性成为了众多摄影爱好者的首选。然而,随着拍摄量的增加,SD卡中的数据管理变得尤为重要。不幸的是,有时我们可能会因为操作失误或系统故障而将SD卡格式化,导致珍贵的照片…

在线骑行网站设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装在线骑行网站软件来发挥其高效地信息处理的作用&#xff0c…

C++之深拷贝和浅拷贝*

两者本质: 浅拷贝:简单的赋值拷贝操作 深拷贝:在堆区中重新申请空间,进行拷贝操作new & delete 注意事项:堆区是在地址中重新申请空间,所以后续一系列操作new delete是通过指针* age进行操作&#xff0…

某 XXX 云主机,使用感受

简单来说就是: 垃圾! 1. 登录垃圾。 我都已经实名认证了, 手机验证码非要发2遍。非要给我起个很难记住的账户名 2. 文档垃圾。 太高估用户的水平了。 建议做点视频教程。而不是各种文档,互相链接,转来转去, 让人心…

LeetCode[简单] 20.有效的括号

给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

NRK3502空气净化器语音芯片方案,本地识别算法+芯片架构

随着环境污染问题的日益严重,空气净化器成为人们居家、办公环境中不可或缺的设备,为了提升用户体验和产品性能,广州九芯电子研发出了一款创新的空气净化器语音芯片方案--NRK3502。此方案结合了本地识别算法与芯片架构,提供Turnkey…

SpringBoot+vue集成sm2国密加密解密

文章目录 前言认识SM2后端工具类实现引入依赖代码实现工具类:SM2Util 单元测试案例1:生成服务端公钥、私钥,前端js公钥、私钥案例2:客户端加密,服务端完成解密案例3:服务端进行加密(可用于后面前…

巴蒂克图案识别系统源码分享

巴蒂克图案识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

安全热点问题

安全热点问题 1.DDOS2.补丁管理3.堡垒机管理4.加密机管理 1.DDOS 分布式拒绝服务攻击,是指黑客通过控制由多个肉鸡或服务器组成的僵尸网络,向目标发送大量看似合法的请求,从而占用大量网络资源使网络瘫痪,阻止用户对网络资源的正…

手把手教你java+selenium数据驱动测试框架搭建与实践

最近在看JavaseleniumTestNgExcel的数据驱动,如何使用TestNg和Excel进行数据驱动测试。我其实是个自动化测试小白,工作之余看看这方面的书,照着敲敲代码,慢慢理解,希望通过自己坚持不懈的努力,在测试这个职…