我们都知道iPhone6S推出了3D Touch的功能,也算是一个大卖点,Google也后来居上,在API25推出了App Shortcuts,按照官方的介绍:作为一名开发人员,您可以定义快捷键来执行特定操作在你的应用程序。这些快捷键可以显示在一个Launcher上 ,帮助用户快速开始共同支持在应用程序或推荐任务。
其实说白了就是长按显示菜单快捷进入某一个界面或者功能,而不用先打开App找到该板块,如图:
不过要注意的是,只有处理主要活动,也就是 ACTION_MAIN和CATEGORY_LAUNCHER标签才能使用App Shortcuts
App Shortcuts 支持静态和动态添加:
静态快捷方式是在打包到APK或app包中的资源文件中定义的。
动态快捷方式只能在运行时发布、更新和删除。
如果用户授予权限,可以在运行时将固定快捷方式添加到受支持的启动程序中。
不过App Shortcuts也有一定的局限性,虽然您可以为您的应用程序一次发布最多五个快捷方式(静态和动态快捷方式的组合),但大多数启动程序只能显示四个快捷方式。
然而,用户可以创建的固定快捷方式的数量没有限制。即使你的应用程序不能删除固定的快捷方式,它仍然可以禁用它们。
并且要注意的是,Launcher是可以访问这些App Shortcuts的数据的,所以关于用户隐私的数据记得隐藏。
一.创建Shortcuts
静态Shortcuts最适合在用户与应用程序交互的整个过程中使用一致结构链接到内容的应用程序。因为大多数启动程序一次只能显示四个快捷方式,所以静态快捷方式对于常见的活动非常有用。例如,如果用户希望以特定的方式查看日历或电子邮件,使用静态快捷方式可以确保他们执行常规任务的经验是一致的。
动态Shortcuts用于上下文敏感的应用程序中的操作。例如,如果您构建的游戏允许用户在启动时从当前级别开始,则需要经常更新快捷方式。使用动态快捷方式允许每次用户清除级别时更新快捷方式。
固定Shortcuts用于特定的、用户驱动的操作。例如,用户可能希望将特定的网站固定到启动程序上。这是有益的,因为它允许用户执行自定义操作,例如一步导航到网站,比使用浏览器的默认实例更快。
1.静态创建Shortcuts
1.在AndroidManifest.xml文件中找到启动项
2.添加meta-data属性,如图:
3.创建资源文件:res/xml/shortcuts.xml
如图所示的配置文件,每一个<shortcut>标签代表一个菜单,我们来看下他的属性含义:
- enabled:是否可见
- icon:图标
- shortcutDisabledMessage:禁用的消息
- shortcutId:id,代码中找到
- shortcutLongLabel:长按标签
- shortcutShortLabel:短按标签
- Intent:意图
- targetClass:目标类
- targetPackage:自身类
- action:响应
可以看出,基本的一些属性配置,结合intent去跳转,我们运行看下效果:
可以看到显示效果还是不错的,显示的是长按的Lable
其中android:shortcutId和android:shortcutShortLabel是必填的,其他都是可选择的,并且这三个字符串的属性都必须定义在strings.xml下,不能直接填写。
好的,我们接着来看动态
2.动态创建Shortcuts
动态创建使用的类是ShortcutManager,他的几个关键的方法如下:
- setDynamicShortcuts() :重新定义整个动态快捷方式列表
- addDynamicShortcuts():添加快捷列表
- updateShortcuts() :更新快捷列表
- removeDynamicShortcuts():删除一组快捷方式
- removeAllDynamicShortcuts():删除全部快捷方式
这是一个动态创建的示例,我们来分析下代码,首先我们通过getSystemService的方式拿到ShortcutManager,ShortcutManager实例必须通过这种getSystemService方式来获取,获取到之后我定义了一个Intent作为等下使用到的跳转,记得一定要添加Action,否则会报错,紧接着可以看到我们创建ShortcutInfo,每一个ShortcutInfo代表一个快捷菜单,最后使用setDynamicShortcuts去创建显示,而ShortcutInfo中就是这几个刚才说过的参数了。来看下预览:
3.创建固定Shortcuts
在Android 8.0 (API级别26)及更高版本上,您可以创建固定的快捷方式。与静态和动态快捷方式不同,固定快捷方式在受支持的启动程序中显示为单独的图标.
创建固定的快捷方式会有用户请求对话框,如果用户不同意则无法创建,我们来看下步骤:
1.判断设备是否支持创建固定快捷方式,使用isRequestPinShortcutSupported,这个方法位于ShortcutManager类中。
2.判断固定快捷方式是否已存在,如果存在,创建一个ShortcutInfo对象,该对象只包含现有快捷方式的ID即可,系统会自动从Shortcuts中查找此快捷方式,如果没有,则按照刚才动态创建Shortcuts一样创建一个ShortcutInfo对象
3.通过调用requestPinShortcut()将快捷方式固定到设备的启动程序。在此过程中,您可以传入PendingIntent对象,该对象仅在快捷方式被成功固定时通知应用程序,如果用户不允许将快捷方式固定到启动程序,则应用程序不会收到回调。
我们来看下代码:
首先我们判断是否支持,然后就创建ShortcutInfo,因为我们刚才已经创建了快捷方式,现在只需要传递一个id即可,接着我们创建一个PendingIntent作为创建固定快捷方式成功后的通知,接着我们通过requestPinShortcut来创建,当然,你也可以不要这个PendingIntent,此时,我们就可以运行了
从运行的图中可以看出,系统提示用户是否显示,点击添加,则在桌面创建图标,图标右下角还有一个小图标,而他显示的Label是我们ShortcutInfo的ShortLabel
4.自定义创建Shortcuts通知
我们创建的固定快捷方式的时候系统会有弹框提示,这个框我们是可以自定义的,让UI更加协调。
首先在你的启动标签里添加一个标签内容为ACTION_CREATE_SHORTCUT
- The system starts your app’s specialized activity.
- The user sets options for the shortcut.
- The user selects the confirmation button.
- Your app creates the shortcut using the createShortcutResultIntent() method. This method returns an Intent, which your app relays back to the previously-executing activity using setResult().
- Your app calls finish() on the activity used to create the customized shortcut.
这种意义不大,没细看。
二.管理Shortcuts
1.可见性
创建好了Shortcuts之后,我们还需要在整个生命周期中去管理这些快捷方式,先说一下固定的快捷方式,因为固定快捷方式出现在启动程序本身,所以它们总是可见的。固定快捷方式只有在以下情况下才会从启动程序中删除:
1.用户删除它。
2.与快捷方式关联的应用程序被卸载。
3.用户可以通过设置> Apps & notifications,选择一个应用程序,然后按下Storage > Clear Storage来清除应用程序的数据。
2.显示顺序
判断这个快捷方式是静态还是动态的,可以通过构建一个ShortcutInfo后调用如下方法:
静态快捷方式:快捷方式的isDeclaredInManifest()方法返回true。
动态快捷方式:快捷方式的ShortcutInfo.isDynamic()方法返回true。
在每一种快捷方式类型(静态和动态)中,快捷方式都按照ShortcutInfo.getRank()的递增顺序排序。当你update,set,add 快捷方式的时候都会更新Rank。
Rank的顺序是自动调整的,所以它们对于每种快捷方式(静态或动态)都是唯一的。例如,如果有三个级别为0、1和2的动态快捷方式,则添加另一个级别为1的动态快捷方式表示将该快捷方式放在第二个位置的请求。作为回应,第三和第四个快捷方式将移到快捷方式列表的底部,它们的排名将分别更改为2和3。
3.管理多种意图和活动
只需要在构建ShortcutInfo的时候将setIntent改成setIntents即可。
要注意的是:当用户选择一个快捷方式,然后按下back键,应用程序就会启动与资源文件中列出的快捷方式倒数第二个意图相对应的活动。这种行为模式在重复按后退按钮时继续,直到用户清除快捷方式创建的后退堆栈为止。当用户下一次按下后退按钮时,系统会将它们导航回启动程序。
后面的还有挺多的小细节,不常用,有兴趣可以自行查阅:
官方给出的Github示例代码: