『uniapp』添加桌面长按快捷操作 shortcuts(详细图文注释)

article/2025/7/19 5:51:43

目录

    • 手机环境适配说明
    • 安卓
      • 效果图
      • 代码
    • iOS(暂未实测,没有水果开发者)
    • 总结


欢迎关注 『uniapp』 专栏,持续更新中
欢迎关注 『uniapp』 专栏,持续更新中

手机环境适配说明

个别手机系统可能需要进行特别的权限设置,否则会无法使用 桌面快捷方式:
已知的有:

  • vivo系统的手机可能需要在"设置"->“后台弹出界面权限”

vivo s10 Pro 实测 安卓11

安卓

安卓应用启动过一次后才会添加快捷方式

效果图

在这里插入图片描述

代码

思路快捷方式跳转的时候会传递参数到plus.runtime.arguments中onshow的时候分析这个参数并跳转,后期可以试着不用uni.navigateTo 可以改用别的跳转方式.

  • 在项目根目录新建文件utils/shortcuts.js,内容如下
const Build = plus.android.importClass("android.os.Build");function addShortcuts(main, shortcuts) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {const shortcutManager = main.getSystemService(plus.android.getAttribute( main, 'SHORTCUT_SERVICE' ));try {const shortcutInfoList = plus.android.newObject('java.util.ArrayList');shortcuts.forEach((item) => {const intent = plus.android.newObject('android.content.Intent', 'io.dcloud.PandoraEntry');plus.android.invoke(intent, 'setClassName', main, "io.dcloud.PandoraEntryActivity");plus.android.invoke(intent, 'setFlags', plus.android.getAttribute(intent, 'FLAG_ACTIVITY_NEW_TASK'));plus.android.invoke(intent, 'putExtra', 'path', item.path);const shortcut = plus.android.newObject( "android.content.pm.ShortcutInfo$Builder", main, item.id);const bitmap = plus.android.invoke('android.graphics.BitmapFactory', 'decodeFile', item.icon);const icon = plus.android.invoke('android.graphics.drawable.Icon', 'createWithBitmap', bitmap);plus.android.invoke(shortcut, 'setShortLabel', item.shortLabel || item.title);plus.android.invoke(shortcut, 'setLongLabel', item.title);plus.android.invoke(shortcut, 'setIntent', intent);plus.android.invoke(shortcut, 'setIcon', icon);plus.android.invoke(shortcutInfoList, 'add', plus.android.invoke(shortcut, 'build'));})return plus.android.invoke(shortcutManager, 'setDynamicShortcuts', shortcutInfoList);} catch (e) {console.log(e);return false;}}return false;
}function removeAll(main) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {const shortcutManager = main.getSystemService(plus.android.getAttribute( main, 'SHORTCUT_SERVICE' ));return plus.android.invoke(shortcutManager, 'removeAllDynamicShortcuts');}
}export { addShortcuts, removeAll };
  • app.vue中设置在应用启动后设置快捷方式
  1. onLaunch: 这个方法在应用启动时调用,主要用于设置应用的初始化逻辑。
    平台判断: 首先判断当前运行平台是否为 Android。只有在 Android 平台下,才会执行接下来的逻辑。
    添加快捷方式: 使用 addShortcuts 方法为应用添加两个快捷方式(扫码和用户),并为它们设置图标和跳转路径。这里使用了 plus.io.convertLocalFileSystemURL 将本地图片路径转换为平台绝对路径,以确保在 Android 上正确引用。
  2. 参数处理
    onShow: 这个方法在应用从后台恢复到前台时调用,主要处理应用接收到的参数。
    参数获取: 使用 plus.runtime.arguments 获取应用启动时传入的参数。
    参数解析: 尝试将获取的参数解析为 JSON 对象。如果解析成功且对象中包含 path 属性,则调用 uni.navigateTo 方法进行页面跳转。
    错误处理: 如果解析参数时发生错误,捕获并输出错误信息,便于调试。
    参数清理: 最后,在 finally 块中将 plus.runtime.arguments 清空,防止再次使用相同的参数。
<script>// js h5+ 模式创建import { addShortcuts } from '@/utils/shortcuts.js'export default {onLaunch: function() {console.log('App Launch')if (uni.getSystemInfoSync().platform === 'android') {this.main = plus.android.runtimeMainActivity();// js h5+ 模式创建let res = addShortcuts(this.main, [{id: 'scan',icon: plus.io.convertLocalFileSystemURL('/static/scan.png'), //本地图片,要使用平台绝对路径path: '/pages/index/index',shortLabel: '',title: '扫码'},{id: 'user',icon: plus.io.convertLocalFileSystemURL('/static/qq.png'), //本地图片,要使用平台绝对路径path: '/pages/index/user',shortLabel: '',title: '用户'},]);}},onShow: function() {console.log('App Show')var args = plus.runtime.arguments;if (args) {console.log('args:', args);try {const parsedArgs = JSON.parse(args);if (parsedArgs.path) {uni.navigateTo({url: parsedArgs.path});}} catch (e) {console.warn('解析参数时发生错误:', e);} finally {// 使用过参数后要清空,因为扫码算从外部启动应用也会接收参数plus.runtime.arguments = "";}}},onHide: function() {console.log('App Hide')}}
</script><style>/*每个页面公共css */
</style>

随便新建一个user和index的页面在pages文件夹下即可测试

iOS(暂未实测,没有水果开发者)

manifest.json 设置iOS

	/* 5+App特有相关 */
"app-plus": {"distribute": {/* ios打包配置 */"ios": {"shortcuts": [{"type": "scan","title": "扫一扫","subtitle": "","iconfile": "/static/images/scan_light.png","userinfo": {"key": "/pages/index/index"}}],},},},

总结

大家喜欢的话,给个👍,点个关注!给大家分享更多计算机专业学生的求学之路!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2024 mzh

Crated:2024-4-1

欢迎关注 『uniapp』 专栏,持续更新中
欢迎关注 『uniapp』 专栏,持续更新中
『未完待续』



http://www.hkcw.cn/article/hOIcLnorxY.shtml

相关文章

【目标检测】【ICCV 2021】条件式DETR实现快速训练收敛

Conditional DETR for Fast Training Convergence 条件式DETR实现快速训练收敛 代码链接 论文链接 摘要 最近提出的DETR方法将Transformer编码器-解码器架构应用于目标检测领域&#xff0c;并取得了显著性能。本文针对其训练收敛速度慢这一关键问题&#xff0c;提出了一种条…

Java线程:线程池详解(ThreadPoolExecutor构造器七个参数、线程池处理Runnable/Callable任务)

认识线程池 什么是线程池&#xff1f; 线程池就是一个可以复用线程的技术 不使用线程池的问题 用户每发起一个请求&#xff0c;后台就需要创建一个新线程来处理&#xff0c;下次新任务来了肯定又要创建新线程处理的&#xff0c;而创建新线程的开销是很大的&#xff0c;并且请求…

华为OD机试真题——开放日活动/取出尽量少的球(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《开放…

day14 leetcode-hot100-25(链表4)

141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 1.哈希集合 思路 将节点一个一个加入HashSet&#xff0c;并用contains判断是否存在之前有存储过的节点&#xff0c;如果有便是环&#xff0c;如果没有便不是环。 具体代码 /*** Definition for singly-linked list.*…

低碳理念在道路工程中的应用-预制路面

一、引子 在上一篇文章里&#xff0c;给大家介绍了预制基层的应用&#xff0c;有人提出&#xff0c;既然基层能够预制&#xff0c;那么&#xff0c;道路面层能不能预制呢&#xff0c;有没有相关的研究成果和应用实例呢&#xff1f;答案是肯定的&#xff0c;在本篇文章中&#x…

React---day5

4、React的组件化 组件的分类&#xff1a; 根据组件的定义方式&#xff0c;可以分为&#xff1a;函数组件(Functional Component )和类组件(Class Component)&#xff1b;根据组件内部是否有状态需要维护&#xff0c;可以分成&#xff1a;无状态组件(Stateless Component )和…

Muplayer——轻量级在线JavaScript 音乐播放器

简单的 JavaScript 音乐播放器 GitHub 地址&#xff1a;https://github.com/Wcowin/Muplayer 在线地址&#xff1a;https://wcowin.work/Muplayer/ 本项目是一个基于原生 JavaScript、HTML 和 CSS 实现的响应式音乐播放器&#xff0c;支持本地音乐添加、播放列表管理、搜索、…

毫秒断电,安全守护|维安WPB系列主动型熔断器重磅登场!

1 主动型熔断器 新能源时代的“主动保护”趋势 随着新能源汽车行业的高速发展&#xff0c;其相关安全事故也层出不穷。为此&#xff0c;工信部于2025 年3月 28 日组织制定了强制性国家标准《电动汽车用动力蓄电池安全要求》&#xff08;GB38031-2025&#xff09;&#xff0c…

Java—— 多线程 第二期

等待唤醒机制(生产者和消费者) 说明 之前的多线程是谁抢到CPU的执行权谁执行&#xff0c;而等待唤醒机制作为一种经典的多线程协作模式&#xff0c;可以实现线程的交替执行。 成员 实现等待唤醒机制需要三个成员&#xff1a;生产者、消费者、标志位 可以分别看作厨师、吃货、…

2025年最新《Python程序设计》题库(含答案)

判断题填空题选择题程序题 点击文末名片可以下载python工具和完整题库&#xff01; 第 1 章 基础知识 &#xff08;部分展示&#xff09; 1、 Python 是一种跨平台、开源、免费的高级动态编程语言。 2、 Python 3.x 完全兼容 Python 2.x。 3、 Python 3.x 和 Python 2.x 唯…

【AI非常道】二零二五年五月,AI非常道

经常在社区看到一些非常有启发或者有收获的话语&#xff0c;但是&#xff0c;往往看过就成为过眼云烟&#xff0c;有时再想去找又找不到。索性&#xff0c;今年开始&#xff0c;看到好的言语&#xff0c;就记录下来&#xff0c;一月一发布&#xff0c;亦供大家参考。 前面的记…

Linux入门(十一)进程管理

Linux 中每个执行的程序都称为一个进程&#xff0c;每个进程都分配一个ID号&#xff08;PID&#xff09; 每个进程都可能以两种方式存在&#xff0c;前台&#xff08;屏幕上可以操作的&#xff09;和后台&#xff08;屏幕上无法看到的&#xff09;&#xff0c;一般系统的服务都…

晨控CK-UR12与西门子PLC配置Modbus TCP通讯连接操作手册

晨控CK-UR12与西门子PLC配置Modbus TCP通讯连接操作手册 晨控CK-UR12系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题&#xff1a;围绕…

Python使用

Python学习&#xff0c;从安装&#xff0c;到简单应用 前言 Python作为胶水语言在web开发&#xff0c;数据分析&#xff0c;网络爬虫等方向有着广泛的应用 一、Python入门 相关基础语法直接使用相关测试代码 Python编译器版本使用3以后&#xff0c;安装参考其他教程&#xf…

高德地图应用OceanBase单元化构建下一代在线地图服务

IEEE International Conference on Data Engineering (ICDE) 是数据库和数据工程领域的顶级学术会议之一&#xff08;与SIGMOD、VLDB并成为数据库三大顶会&#xff09;&#xff0c;自1984年首次举办以来&#xff0c;每年举办一次。ICDE涵盖广泛的主题&#xff0c;包括数据库系统…

软考-系统架构设计师-第十九章 嵌入式系统架构设计理论与实践

嵌入式系统架构设计理论与实践 19.1 嵌入式系统发展历程19.2 嵌入式系统硬件19.3 嵌入式系统软件19.4 嵌入式系统软件架构设计方法19.5 嵌入式系统软件架构实践 19.1 嵌入式系统发展历程 发展历程硬件软件主要特点单片微型计算机&#xff08;SCM&#xff09;单片机无操作系统 …

DeepSeek-R1 重磅升级,智能体验再进化!

DeepSeek AI 爱好者们注意啦&#xff01;DeepSeek R1 模型完成小版本升级&#xff0c;新版本 DeepSeek-R1-0528 震撼登场。想体验超强思考与推理能力&#xff1f;官方网站、APP、小程序&#xff0c;一键开启 “深度思考” 功能&#xff0c;新版等你来探索&#xff01;API 也同步…

预处理深入详解:预定义符号、宏、命名约定、命令行定义、条件编译、头文件的包含

目录 一、预定义符号 二、#define定义常量 三、宏 &#xff08;一&#xff09;#define定义宏 &#xff08;二&#xff09;带有副作用的宏参数 &#xff08;三&#xff09;宏替换的规则 &#xff08;四&#xff09;宏和函数的对比 四、#和## &#xff08;一&#xff09…

深度解析:跨学科论文 +“概念迁移表” 模板写作全流程

跨学科论文速通&#xff01;融合“概念迁移表”的写作导航模板 你的论文是否曾被导师皱眉评价为“四不像”&#xff1f;不同学科的术语在稿纸上打架&#xff0c;核心逻辑若隐若现&#xff1f; 别让心血沦为学术混搭的牺牲品。一张精心设计的 概念迁移表&#xff0c;能将两个看…

Linux安装及管理程序

1 Linux应用程序基础 1.1 Linux 命令与应用程序的关系 在 Linux 操作系统中&#xff0c;一直以来命令和应用程序并没有特别明确的区别&#xff0c;从长期使用习惯来看&#xff0c;可以通过以下描述来对两者进行区别&#xff1a; 应用程序命令的执行文件大多比较小&#xff0…