Android7.1新特性:快捷方式Shortcuts详解

Shortcuts介绍

Android7.1(API Level 25)及以上系统可以自定义Shortcuts,通过在桌面上长按App Icon弹出Shortcut列表,点击某个shortcut可使用户快捷得打开App里常用的或推荐的任务。长按列表中的任一个Shortcut可拖动到桌面进行固定(可以成为Pinned Shortcut)。如下图:
这里写图片描述

1.1、Shortcuts的简单作用

每个Shortcut可以关联一个或多个intents,每个intent启动一个指定的action; 官方给出了几个可以作为shortcut的例子,比如:

  • 在地图类app中,指导用户到特定的位置;
  • 在社交类app中,发送消息给一个朋友;
  • 在媒体类app中,播放视频的下一片段;
  • 在游戏类app中,下载最后保存的要点;

在实际开发中,我们具体想让哪些操作作为快捷方式,可自行定义。

1.2、Shortcuts的分类及区别

主要分为两大类:

  • Static Shortcuts : 静态快捷方式
  • Dynamic Shortcuts : 动态快捷方式

区别:

  • 静态Shortcuts只能通过升级应用来进行update;动态shortcuts可随时进行update
  • 静态shortcuts的Intent无法设置Flag,默认为FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK,即应用运行中会清除所有已存在的Activity;动态shortcuts的Intent可以设置Flag
  • 排序问题:静态shortcuts默认比动态shortcut离App Icon更近,而且无法动态改变静态shortcut的展示顺序,因为它们是按照shortcuts.xml文件中定义的顺序来显示的;动静shortcuts的排列顺序可以使用setRank(int)方法设置,int值越大,排序越高,即离App Icon越远。如下图:
    这里写图片描述
1.2.1、静态shortcuts的创建

①:在app的AndroidManifest.xml文件中,找到MainActivity,即设置了action为<action android:name=”android.intent.action.MAIN” />,且category设置为 <category android:name=”android.intent.category.LAUNCHER” />的activity;为其添加<meta-data>….</meta-data>指向定义Shortcuts的资源文件。代码如下:

<activity android:name=".MainActivity">
      <intent-filter>
             <action android:name="android.intent.action.MAIN" />
             <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data  android:name="android.app.shortcuts"
                  android:resource="@xml/shortcuts"/>
</activity>

②:创建定义AppShortcuts的资源文件,res/xml/shortcuts.xml文件

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 第一个静态shortcut -->
    <shortcut
        android:shortcutId="static_one"
        android:enabled="true"
        android:icon="@mipmap/mika_icon_default"
        android:shortcutLongLabel="@string/static_one_long_label"
        android:shortcutDisabledMessage="@string/static_disabled_message"
        android:shortcutShortLabel="@string/static_one_short_label">
        <!--
            一个shortcut,当有多个intents与之相关联时,在用户启动该shortcut时,最先呈现给用户的是
            <intent>...</intent>集合中最后一个intent操作事件。
            即这里创建了一个intent的回退栈,最后一个才是被快捷方式打开的那个。
        -->
        <intent
            android:action="android.intent.action.MAIN"
            android:targetPackage="com.example.appscdemo"
            android:targetClass="com.example.appscdemo.MainActivity"/>

        <intent
            android:action="android.intent.action.MAIN"
            android:targetPackage="com.example.appscdemo"
            android:targetClass="com.example.appscdemo.StaticAppScOneActivity"/>

        <intent
            android:action="android.intent.action.MAIN"
            android:targetPackage="com.example.appscdemo"
            android:targetClass="com.example.appscdemo.StaticAppScTwoActivity"/>

    </shortcut>
    <!-- 第二个静态shortcut -->
    <shortcut
        android:shortcutId="static_two"
        android:enabled="true"
        android:shortcutLongLabel="@string/static_two_long_label"
        android:shortcutDisabledMessage="@string/static_disabled_message"
        android:shortcutShortLabel="@string/static_two_short_label">

        <intent
            android:action="android.intent.action.MAIN"
            android:targetPackage="com.example.appscdemo"
            android:targetClass="com.example.appscdemo.MainActivity"/>

        <intent
            android:action="android.intent.action.MAIN"
            android:targetPackage="com.example.appscdemo"
            android:targetClass="com.example.appscdemo.StaticAppScTwoActivity"/>

    </shortcut>
</shortcuts>

以shortcuts元素为根,可以包含多个shortcut元素,每个shortcut元素标示一个shortcut。其中属性分别标示:

  • shortcutId:shortcut唯一标识符,相同的shortcutId会被覆盖。(必设属性)
  • enable:shortcut是否启用,true启用,false是禁用(若设置为false,不如删除掉该快捷方式)(可选属性)
  • icon:显示在快捷方式左边的图标。(可选属性)
  • shortcutLongLabel:当launcher的空间足够时将会显示shortcut的长文本描述,不宜过长,如果过长或未设置时会显示shortcutShortLabel (可选属性)
  • shortcutShortLabel : shortcut的简要说明,这项是必须的。(必设属性)
  • intent : 这里定义快捷方式被点击之后将会打开的intent (必设属性)
  • shortcutDisabledMessage : 当你禁用了shortcut之后,它将不会显示在用户长按应用图标后打开的快捷方式里,但是用户可以把一个快捷方式拖拽到launcher的某个页面成为Pinned Shortcut,被禁用之后这个快捷方式就会显示为灰色,点击这个Pinned Shortcut则会显示一个内容为shortcutDisabledMessage的Toast。(可选属性)
    这里写图片描述
1.2.2、动态shortcuts的创建

代码创建Dynamic shortcut,需要使用API ShortcutManagerShortcutInfo.Builder;通过ShortcutInfo.Builder新建ShortcutInfo,再通过ShortcutManager添加即可。动态shortcut可以在运行时动态改变内容,无需重写部署App。下面直接看代码,而不在叙述创建的具体步骤:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //要确保API Level 大于等于 25才可以创建动态shortcut,否则会报异常。
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
            initDynamicShortcuts();
        }
    }

    /**
     * 为App创建动态Shortcuts
     */
    private void initDynamicShortcuts() {
        //①、创建动态快捷方式的第一步,创建ShortcutManager
        ShortcutManager scManager = getSystemService(ShortcutManager.class);
        //②、构建动态快捷方式的详细信息
        ShortcutInfo scInfoOne  = new ShortcutInfo.Builder(this, "dynamic_one")
                .setShortLabel("Dynamic Web site")
                .setLongLabel("to open Dynamic Web Site")
                .setIcon(Icon.createWithResource(this, R.mipmap.tool_music_icon))
                .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com")))
                .build();

       ShortcutInfo scInfoTwo = new ShortcutInfo.Builder(this, "dynamic_two")
                .setShortLabel("Dynamic Activity")
                .setLongLabel("to open dynamic one activity")
                .setIcon(Icon.createWithResource(this, R.mipmap.tool_luck_icon))
                .setIntents(new Intent[]{
                                    new Intent(Intent.ACTION_MAIN, Uri.EMPTY, this, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),//加该FLAG的目的是让MainActivity作为根activity,清空已有的任务
                                    new Intent(DynamicASOneActivity.ACTION)
                            })
                .build();
        //③、为ShortcutManager设置动态快捷方式集合
        scManager.setDynamicShortcuts(Arrays.asList(scInfoOne, scInfoTwo));

        //如果想为两个动态快捷方式进行排序,可执行下面的代码
        ShortcutInfo dynamicWebShortcut = new ShortcutInfo.Builder(this, "dynamic_one")
                .setRank(0)
                .build();
        ShortcutInfo dynamicActivityShortcut = new ShortcutInfo.Builder(this, "dynamic_two")
                .setRank(1)
                .build();

        //④、更新快捷方式集合
        scManager.updateShortcuts(Arrays.asList(dynamicWebShortcut, dynamicActivityShortcut));
    }
}

效果如下图:

这里写图片描述

ShortcutManager API可以帮助我们实现新建、更新、移除快捷方式的操作:

  • 新建:方法setDynamicShortcuts() 可以添加或替换所有的shortcut;方法addDynamicShortcuts() 来添加新的shortcut到列表中,超过最大个数会报异常

  • 更新:方法updateShortcuts(List shortcutInfoList) 更新已有的动态快捷方式;

  • 删除:方法removeDynamicShortcuts(List shortcutIds) 根据动态快捷方式的ID,删除已有的动态快捷方式;方法removeAllDynamicShortcuts() 删除掉app中所有的动态快捷方式;

  • List<ShortcutInfo> getDynamicShortcuts() : 得到所有的动态shortcuts;
1.2.3、禁用Shortcuts

Pinned Shortcuts:指用户通过拖拽任到桌面上的Shortcuts,App不可以动态添加、修改、删除这些Shortcuts,只能禁用它们。即便App内删除了某个Shortcut,对应的Pinned Shortcut也不会被删除。Pinned Shortcuts 并没有个数限制,并且Pinned Shortcut 对应的 Shortcut 即便被动态删除了,依然可以通过 id 进行 Update 操作。

  • disableShortcuts(List<String> shortcutIds) 或 disableShortcuts(List&ltString> shortcutIds, CharSequence disabledMessage) 禁用动态的快捷方式。
  • 如果在APP版本升级时删除了某个静态快捷方式,那么系统会自动的禁用相应的static shortcuts;
1.2.4、频率限制

当App完全退到后台(无 Activity 或 Service 在前台时),其操作 Shortcut(包括添加、删除、修改) 的频率是受限的。可通过isRateLimitingActive()查询是否已受限,true表示已受限。
如果在开发或测试过程中,偶遇了频率限制的情况,可通过开发者选项中“重置 ShortcutManager 调用频率限制”或命令行 adb shell cmd shortcut reset-throttling [ –user USER-ID ] 解决。

1.3、最佳实践和需要注意的问题

  1. 遵循shortcuts设计指导方针:确保你的应用shortcuts在外观上和系统的shortcuts保持一致。AppShortscuts的Icons都是圆形。

    Shortcut Icon 简介:

    这里写图片描述

    Live Area:所有的Icon内容应该保持在44dp * 44dp的活动区域内,由一个实体的背景填充Material Grey 100 (or #F5F5F5)。
    Total Area:2dp的padding必须围绕在Live Area区域周围,使total Icon的大小为 48dp * 48dp。

    Standard Icons介绍:有一个Material System Icon居中与Live Area中间。

    这里写图片描述

    Single Avatar:单个头像作为Shortcut Icon时,效果如下图:
    这里写图片描述

    Group Avatars:多个头像拼成的Shortcut Icon,包含有2到4个图片在圆形的背景上,他们必须被创建在XXXHDPI文件中,效果如下图:

    这里写图片描述

  2. 最多创建4个特定的shortcuts:目前虽然说Static shortcuts 和Dynamic shortcuts之和最多为5个,但实际上只会显示4个。当我们尝试添加第六个shortcut时, 应用会抛出异常: java.lang.IllegalArgumentException: Max number of dynamic shortcuts exceeded.

  3. 限制 Label 长度:其中shortcutShortLabel建议不超过 10 个字符,shortcutLongLabel 建议不超过 25 个字符。

  4. 如何更好的删除(废弃)老的 Shortcut
    这里主要考虑到删除老的 Shortcut,可能会影响已经固定的 Shortcut。
    对于静态 Shortcuts,直接删除配置文件中对应的 Shortcut 即可,系统桌面会将已固定的该 Shortcut 置灰,点击会提示 shortcutDisabledMessage。
    对于动态 Shortcuts 建议通过禁用的方式而不是直接删除的方式,因为已经删除的动态 Shortcut 如果被固定了依然是可用的,所以希望该入口不可用最好的方式是禁用。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值