目录
一、为什么需要桌面图标长按快捷菜单
二、实现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 桌面图标快捷菜单。
首先看下我们已经是实现的效果:
主Form上放置一个TabControl1,然后设置两个TabItem,分别是:TabItem_Main、TabItem_ShortCut。上面分别放置显示不同信息的label。选择 Android 32编译平台,在主Form中引用如下单元:
Androidapi.JNI.App,
Androidapi.JNI.JavaTypes,
Androidapi.Helpers,
通过Delphi IDE 编辑AndroidManifest.template.xml文件,这个文件位于项目工程文件目录下,需要先编译下,否则可能还没有生成这个文件。在activity 标记中增加一行,就在intent-filter 元素的关闭符号后增加(
...
<%activity%>
程序启动的时候会检查AndroidManifest.template.xml这个文件,如果发现有android.app.shortcuts项,则会根据这个项目的信息加载APP桌面图标快捷菜单。
下面就介绍在android.app.shortcuts项中引用的XML文件(shortcuts.xml)。
在项目根目录位置处,也就是AndroidManifest.template.xml这个文件所在的目录创建shortcuts.xml文件。
说明:
这个文件放哪里都是可以的,但是为了方便,建议放在项目根目录下,和AndroidManifest.template.xml文件在一个目录中。这个文件是一个资源文件,也是需要被引用的。
快捷菜单A
Shortcut is disabled
使用任何图标工具,创建一个快捷菜单的图标ICON。我们使用128 X 128 像素的png文件。对于图标文件,网上有很多资源,国内有名的阿里图标 icon font;国外有名的 icons8
至此,我们已经创建好了两个XML文件(shortcuts.xml and strings.xml)和一个图标文件(shortcut.png)。我们需要让最终构建过程正确的引用这几个文件(最终的APK)。需要在Delphi 的 IDE 中,打开Project -> Deployment菜单,按照如下格式增加以上几个文件。
需要注意的是,上图只是配置了Debug configuration。如果需要所有的编译都增加这几个资源,请选择All configration。
说明如下:
恭喜!至此,我们的APP已经可以实现桌面长按快捷菜单了!!
完了吗?还没有,因为我们还没有实现如何知道用户按下的是【快捷菜单A】呢?
程序如果希望获知用户是通过长按桌面图标快捷菜单启动的程序,还是直接单击桌面图标启动的程序?可以通过action属性来获知。对于本例就是shortcuts.xml中定义的action属性值:android.intent.action.MYACTION1,通过在程序启动的时候判断action值就可以确定程序启动的入口到底是什么? 简单的在主窗体创建的时候判断下代码:
procedure TForm1.FormCreate(Sender: TObject);
var
action : string;
begin
action := JStringToString(TAndroidHelper.Activity.getIntent.getAction);
if action = 'android.intent.action.MYACTION1' then //说明是快捷菜单
TabControl1.ActiveTab := TabItem_ShortCut
else
TabControl1.ActiveTab := TabItem_Main; //进入主界面
Label_action.Text := action;
end;
如果用户直接进入程序,则界面tab活动的是【主界面进入显示】;如果用户是通过桌面图标长按快捷菜单【快捷菜单A】进入的,则界面tab活动的是【SHORTCUT进入界面】。
源程序下载:源程序(在Delphi 11.1下编译,如果是其他的Delphi版本,需要重新创建工程,因为AndroidManifest.template.xml文件可能因为版本不同而不同,从而导致不同版本直接使用是编译不通过的)