一些废话
Android7.1的Shortcuts也出来好久了,但是没有在自己的应用上尝试过,原因是之前手机一直是6.0的系统,直到最近才刷到了7.1.1,不过我发现,除了Google公司自己的app,适配了shortcuts功能的确实很少,可能是Android N的系统使用普及度太小,于是果断决定给我们公司的app加上shortcuts的功能,虽然是一些不起眼的功能,但至少要走在技术革新的最前沿吧。
使用及说明
关于Shortcuts的官方文档在这里
-
Shortcuts的作用:官方的说法,让用户在你的app上快速开始一个常用或者推荐的任务。
-
使用条件:targetSdkVersion必须在25或者更高。
-
类型:静态(xml方式)和动态(代码方式)
-
注意事项:虽然其他app是不能在你app的shortcuts里访问元数据,但是启动器本身却可以访问这些数据。因此,我们应该在元数据中隐藏敏感的用户信息。
静态Shortcuts
之所以称为静态,是因为它是定义在资源文件中的,除非更新整个app,否则是不能更改shortcuts的东西,不过这种方式使用起来也跟简单,两步搞定。
第一步在AndroidManifest.xml中的启动activity中加上meta-data标签:其中name是固定的,resource是一个名为shortcuts.xml的资源文件。
第二步在res目录下新建xml资源目录,并在其下新建xml文件,命名随意。这里要吐槽下,在Android Studio里新建xm文件时,居然不能选择root-element是shortcuts的,还得自己手动去敲,气人。
另外还要吐槽下官方文档,上面说一个app同时可以show五个shortcuts(不管是静态还是动态),但实际上最多只能显示4个,多出的不会显示出来。
shortcut标签下面的属性:
- android:shortcutId必须唯一;
- android:icon是该shortcut的图标;
- android:enabled表示该shortcus是否可用,false表示禁用,是不会在shortcuts列表中显示出来的;
- android:shortcutDisabledMessage表示当shortcut拖到手机桌面固定时,而enabled又是false禁用时点击桌面上的icon时提示给用户的文字,而且此时桌面上的icon会变灰色;
- android:shortcutLongLabel是在shortcuts列表中该shortcut的名字;
- android:shortcutShortLabel是拖动到桌面上显示的该shortcut的名字;
- intent是点击shortcut时跳转到的app内的页面,其中action是必须的,而且是能是android.intent.action.VIEW
intent可以设置多个,相当于是按顺序将这些activity放入任务栈中,最后一个activity在栈顶,因此,点击shortcut时跳转的是最后一个intent指定的activity页面,当按返回键时,则会回退到上一个intent指定的activity。
shortcut标签也可以设置多个(最多4个),在xml中从上至下的顺序,最上面的离app在桌面的icon越近,越往下越远。
动态Shortcuts
动态即在app运行时执行发布更新和移除shortcuts等操作。
private void initShortcuts() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) { return; } ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); Intent mall = new Intent(Intent.ACTION_VIEW); mall.setClass(this, MallServiceActivity.class); mall.setPackage(BuildConfig.APPLICATION_ID); ShortcutInfo mallShortcut = new ShortcutInfo.Builder(this, "mall") .setShortLabel(getString(R.string.mall)) .setLongLabel(getString(R.string.mall)) .setDisabledMessage(getString(R.string.shortcutDisabledMessage)) .setIcon(Icon.createWithResource(this, R.drawable.icon1_chosen)) .setIntent(mall) .build(); Intent ticket = new Intent(Intent.ACTION_VIEW); ticket.setClass(this, OrderTicketDescActivity.class); ticket.setPackage(BuildConfig.APPLICATION_ID); ShortcutInfo ticketShortcut = new ShortcutInfo.Builder(this, "tuan") .setShortLabel(getString(R.string.tuan)) .setLongLabel(getString(R.string.tuan)) .setDisabledMessage(getString(R.string.shortcutDisabledMessage)) .setIcon(Icon.createWithResource(this, R.drawable.icon3_chosen)) .setIntent(ticket) .build(); shortcutManager.setDynamicShortcuts(Arrays.asList(mallShortcut, ticketShortcut));}
ShortcutInfo.Builder的第二个参数即shortcutId,不能重复,否则会覆盖。setDynamicShortcuts方法是设置一组shortcuts,addDynamicShortcuts则是在原来的基础上增加一组,updateShortcuts是更新一组,removeDynamicShortcuts删除一组,removeAllDynamicShortcuts删除所有。这些方法对shortcut操作时是根据其唯一的shortcutId来的,所以这玩意千万不能重复的。
另外ShortManager还有一个方法getPinnedShortcuts,作用是获取被拖动固定到桌面上的shortcuts,这些shortcuts是不能被在代码中被修改删除的,只能通过disableShortcuts方法禁用,禁用后icon会变灰色,并且点击时提示shortcutDisabledMessage。
当某个ShortcutInfo.Builder需要设置多个Intent时,可以使用setIntents方法来代替setIntent方法。