目录

一、为什么需要桌面图标长按快捷菜单

二、实现Android桌面图标快捷菜单

第一步:Delphi 创建一个 FMX 工程文件:ShortCut_Demo.dpr

第二步:编辑项目中的 AndroidManifest.template.xml 文件

第三步:创建shortcuts.xml文件

第四步:创建 strings.xml 文件

第五步:创建菜单图标文件 shortcut.png

第六步:配置Deployment

第七步:实现获知用户按下【快捷菜单A】


首先,看下Android桌面图标快捷菜单的例子,在桌面上长按微信和支付宝APP图标。会出现快捷菜单,微信有三个,支付宝有4个快捷菜单。参考文档(Andrea's Blog)

自从Android 7.1 开始就支持桌面图标长按快捷菜单功能,Delphi从10.3 Rio版本开始支持,当前Android的最新版本是12,Delphi的版本是11.1了。关于Android 桌面图标快捷菜单官方资料可参考:this location of the Android’s official documentation.

一、为什么需要桌面图标长按快捷菜单

如果我们的App提供有很多功能,例如可能有好几个Form或者Frame,如果没有桌面快捷菜单,用户操作首先必须进入主界面,然后才能根据主界面的引导(菜单或者Tab)进入不同的功能界面,但是有了桌面快捷菜单后,我们就可以很方便的,很友好的让用户直接进入到程序的某个功能。例如微信的“扫一扫”和支付宝的“扫一扫”,这样是不是感觉界面更方便。关于Android的桌面图标快捷菜单功能,按照Andrea的说法,IOS从2015年的IOS9也已经支持桌面快捷菜单。

关于桌面快捷菜单,按照官方资料是支持静态和动态菜单的,本文只涉及静态菜单,动态菜单请参见Android官方资料。接下来我们通过一个例子一步一步实现Android 桌面图标快捷菜单。

首先看下我们已经是实现的效果:

​​​​​​​

二、实现Android桌面图标快捷菜单

第一步:Delphi 创建一个 FMX 工程文件:ShortCut_Demo.dpr

主Form上放置一个TabControl1,然后设置两个TabItem,分别是:TabItem_Main、TabItem_ShortCut。上面分别放置显示不同信息的label。选择 Android 32编译平台,在主Form中引用如下单元:

Androidapi.JNI.App,
  Androidapi.JNI.JavaTypes,
  Androidapi.Helpers,

第二步:编辑项目中的 AndroidManifest.template.xml 文件

通过Delphi IDE 编辑AndroidManifest.template.xml文件,这个文件位于项目工程文件目录下,需要先编译下,否则可能还没有生成这个文件。在activity 标记中增加一行,就在intent-filter 元素的关闭符号后增加(<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />)。

            ...</intent-filter><!-- 下面这一句是ShortCut需要的,新增加的,位置不要编 --><meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" /></activity>
<%activity%>

程序启动的时候会检查AndroidManifest.template.xml这个文件,如果发现有android.app.shortcuts项,则会根据这个项目的信息加载APP桌面图标快捷菜单。

下面就介绍在android.app.shortcuts项中引用的XML文件(shortcuts.xml)。

第三步:创建shortcuts.xml文件

在项目根目录位置处,也就是AndroidManifest.template.xml这个文件所在的目录创建shortcuts.xml文件。

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"><shortcutandroid:shortcutId="myshortcut1"android:enabled="true"android:icon="@drawable/shortcut"android:shortcutShortLabel="@string/my_shortcut1"android:shortcutLongLabel="@string/my_shortcut1"android:shortcutDisabledMessage="@string/my_shortcut1_disabled"><intentandroid:action="android.intent.action.MYACTION1"android:targetPackage="com.embarcadero.ShortCut_Demo"android:targetClass="com.embarcadero.firemonkey.FMXNativeActivity"/><categories android:name="android.shortcut.conversation"/></shortcut>
</shortcuts>

说明:

  1. 需要提供一个shortcutId值,这是一个字符串,本例中是"myshortcut1",不需要双引号。
  2. 需要提供一个shortcutShortLabel值,这个也是一个字符串,实际上就是我们显示快捷菜单的名字,一般长度不要超过10个字符。它是通过一个资源文件引用的,下面会介绍。
  3. 需要保证enabled="true",否则会不显示菜单,如果为false时,就会显示shortcutDisabledMessage。
  4. 可以给菜单提供一个图标(128x128),这个就是icon,本例中为:shortcut.png
  5. 设置 intent参数,非常重要的参数是tagetPackage,这个必须和我们当前程序的包名一致。本例为com.embarcadero.ShortCut_Demo。另外一个参数action是一个字符串,当快捷菜单激活(按下)时,系统通过这个参数告知是那个菜单按下了。

第四步:创建 strings.xml 文件

这个文件放哪里都是可以的,但是为了方便,建议放在项目根目录下,和AndroidManifest.template.xml文件在一个目录中。这个文件是一个资源文件,也是需要被引用的。

<?xml version="1.0" encoding="utf-8"?>
<resources><string name="my_shortcut1">快捷菜单A</string><string name="my_shortcut1_disabled">Shortcut is disabled</string>
</resources>

第五步:创建菜单图标文件 shortcut.png

使用任何图标工具,创建一个快捷菜单的图标ICON。我们使用128 X 128 像素的png文件。对于图标文件,网上有很多资源,国内有名的阿里图标 icon font;国外有名的 icons8

第六步:配置Deployment

至此,我们已经创建好了两个XML文件(shortcuts.xml and strings.xml)和一个图标文件(shortcut.png)。我们需要让最终构建过程正确的引用这几个文件(最终的APK)。需要在Delphi 的 IDE 中,打开Project -> Deployment菜单,按照如下格式增加以上几个文件。

需要注意的是,上图只是配置了Debug configuration。如果需要所有的编译都增加这几个资源,请选择All configration。

说明如下:

  1. shortcuts.xml 的“Remote Path”,请输入:res\xml\
  2. strings.xml 的“Remote Path”,请输入:res\values\
  3. shortcut.png 的“Remote Path”,请输入: res\drawable\

恭喜!至此,我们的APP已经可以实现桌面长按快捷菜单了!!

完了吗?还没有,因为我们还没有实现如何知道用户按下的是【快捷菜单A】呢?

第七步:实现获知用户按下【快捷菜单A】

程序如果希望获知用户是通过长按桌面图标快捷菜单启动的程序,还是直接单击桌面图标启动的程序?可以通过action属性来获知。对于本例就是shortcuts.xml中定义的action属性值:android.intent.action.MYACTION1,通过在程序启动的时候判断action值就可以确定程序启动的入口到底是什么? 简单的在主窗体创建的时候判断下代码:

procedure TForm1.FormCreate(Sender: TObject);
varaction : string;
beginaction := JStringToString(TAndroidHelper.Activity.getIntent.getAction);if action = 'android.intent.action.MYACTION1' then  //说明是快捷菜单TabControl1.ActiveTab := TabItem_ShortCutelseTabControl1.ActiveTab := TabItem_Main;   //进入主界面Label_action.Text := action;
end;

如果用户直接进入程序,则界面tab活动的是【主界面进入显示】;如果用户是通过桌面图标长按快捷菜单【快捷菜单A】进入的,则界面tab活动的是【SHORTCUT进入界面】。

源程序下载:源程序(在Delphi 11.1下编译,如果是其他的Delphi版本,需要重新创建工程,因为AndroidManifest.template.xml文件可能因为版本不同而不同,从而导致不同版本直接使用是编译不通过的

【Delphi】Android 桌面图标添加快捷菜单功能相关推荐

  1. Android 桌面图标添加未读消息角标APP角标最佳实践

    Android 桌面图标添加未读消息角标APP角标最佳实践 本项目的完整演示代码 https://github.com/benchegnzhou/AndroidDevelomentArtDemo 最近 ...

  2. Android给ListView添加侧滑菜单功能

    贼简单,但是上次集成完之后忘记整理,所以写的有点简单 SwipeMenu类 继承自ViewGroup package com.onepilltest.others;import android.con ...

  3. android 为桌面图标添加数字角标

    android 为桌面图标添加数字角标 我的github项目 BadgeForAppIcon 看完麻烦 star 一下 在某些app的设计中,产品经理总会想当然的提出为桌面图标添加数字角标的需求.作为 ...

  4. Android 桌面图标长按快捷菜单

    为了更快使用APP的某个功能,在手机桌面长按图标呼出快捷菜单 需要注意:在7.0以上的系统才支持该功能 两种方案可以实现该功能,第一种静态文件,不过基本上满足不了日常需求.第二种就是动态加载. Sho ...

  5. Android桌面图标布局,android安装运行launcher并修改桌面图标

    以系统及程序的方式安装和运行Launcher,才能在Launcher启动的时候就让默认的AppWidget程序显示出来.否则将会出现 java.lang.SecurityException: bind ...

  6. 开始菜单中计算机栏里没有桌面图标,电脑开始菜单不见了怎么办

    电脑开始菜单不见了怎么办 开始菜单是视窗操作系统(Windows)中图形用户界面(GUI)的基本部分,可以称为是操作系统的中央控制区域.下面是聚优经验网小编收集整理的电脑开始菜单不见了怎么办,欢迎阅读 ...

  7. android icon红点,android 桌面图标消息红点

    前言 消息通知是大多数用户类app都会用到的功能,这里介绍的是当有新消息的时候,app的桌面图标像微信和qq那样右上角出现红色的消息数量红点.实现代码分为8.0-版本和8.0+版本. aaa.png ...

  8. Android 桌面图标右上角显示未读消息数字

    背景: 在Android原生系统中,众所周知不支持桌面图标显示未读消息提醒的数字,虽然第三方控件BadgeView可以实现应用内的数字提醒.但对于系统的图标,特别是app的logo图标很难实现数字标志 ...

  9. One Switch一键隐藏Mac桌面图标,Mac必备功能开关

    One Switch是mac必备的一键功能开关工具,小编亲测推荐. One Switch将一些Mac重要的功能集中在一个菜单工具里面,一键可以切换和启动,非常的便利,并且One Switch非常的轻量 ...

最新文章

  1. C++ string 类常用函数
  2. python基础: String类型
  3. 解决Geoserver请求跨域的几种思路
  4. SAP Spartacus B2B List里的listData$设计原理
  5. react native ScrollView
  6. Emacs基本快捷键
  7. Latex写分段函数
  8. android关闭应用及获取运营商ISP,判断sim卡属于哪个运营商
  9. CSS3 新怎的伪类选择器
  10. 红外测距模块 51单片机_基于51单片机的红外发射和接收程序。
  11. 数据库备份软件带邮件发送
  12. angular8.x + ngx-translate实现国际化
  13. 【多功能改进】基于OpenCV图像采集的人脸识别网络推流及局域网无线控制系统(将图像在URL地址上输出,可做成网络摄像头,带识别框)
  14. java判断时间日期是否等于当前日期
  15. java我们一起打雪仗_一起打雪仗的作文
  16. 道阻且长 行者将至 ——新高考下的教学策略
  17. WinRAR分卷压缩与解压缩
  18. hwcomposer介绍
  19. 硬件电子开发常用工具
  20. 超高薪资vs安逸生活,拼多多和国家电网,选哪个?

热门文章

  1. Ansible 部署的时候提示错误 SSH password instead
  2. idea激活码?学生如何白嫖使用idea?
  3. PAT.A1010 Radix
  4. 【Kafka】生产者
  5. system函数的总结
  6. 移动端页面键盘弹出后导致body高度变低背景图片被挤上去解决方法
  7. element-ui 阻止冒泡事件
  8. c 语言友元函数重载,C++友元函数重载++和--运算符
  9. 【Linux】工具(3)——gcc/g++
  10. 嫌微信公众号排版太丑?这里让你一步到位