Android ShortCuts使用

ShortCuts是什么?

Shortcuts是指在桌面长按app图标而出现的快捷方式,可以为你的app的关键功能添加更加快速的入口而不是先打开app这里写图片描述

点击快捷方式可以访问应用功能,而且这种快捷方式也可以被拖拽到桌面的单独位置,变成单独的左面快捷方式。
这里写图片描述

添加ShortCuts的方式

有两种方式:
1.静态方式:在xml中定义,适用于一些通用操作
2.动态方式:由ShortcutManager发布,可以根据用户的行为或者偏好添加,可以动态更新

一些限制条件:
1.每个应用目前最多可以有5个shortcuts(包括静态和动态)
2.shortcuts是android7.1(api25)的api,所以只能在android7.1的设备上才能正常显示,同时需要launcher支持,nexus系列手机和pixel系列手机已经支持了。

动态添加方式

动态添加方式比较灵活,可以适用的场景比较丰富,一般开发过程中用到的机会比较多。这种方式可以再用户适用app的过程中构建,更新,或者删除。

-发布:setDynamicShortcuts,addDynamicShortcuts
-更新:updateShortcuts
-删除:removeDynamicShortcuts,removeAllDynamicShortcuts

ShortcutManager还有其他操作方法,代码如下:

 public boolean setDynamicShortcuts(List<ShortcutInfo> shortcutInfoList) {
        throw new RuntimeException("Stub!");
    }

    public List<ShortcutInfo> getDynamicShortcuts() {
        throw new RuntimeException("Stub!");
    }

    public List<ShortcutInfo> getManifestShortcuts() {
        throw new RuntimeException("Stub!");
    }

    public boolean addDynamicShortcuts(List<ShortcutInfo> shortcutInfoList) {
        throw new RuntimeException("Stub!");
    }

    public void removeDynamicShortcuts(List<String> shortcutIds) {
        throw new RuntimeException("Stub!");
    }

    public void removeAllDynamicShortcuts() {
        throw new RuntimeException("Stub!");
    }

    public List<ShortcutInfo> getPinnedShortcuts() {
        throw new RuntimeException("Stub!");
    }

    public boolean updateShortcuts(List<ShortcutInfo> shortcutInfoList) {
        throw new RuntimeException("Stub!");
    }

    public void disableShortcuts(List<String> shortcutIds) {
        throw new RuntimeException("Stub!");
    }

    public void disableShortcuts(List<String> shortcutIds, CharSequence disabledMessage) {
        throw new RuntimeException("Stub!");
    }

    public void enableShortcuts(List<String> shortcutIds) {
        throw new RuntimeException("Stub!");
    }

    public int getMaxShortcutCountPerActivity() {
        throw new RuntimeException("Stub!");
    }

    public boolean isRateLimitingActive() {
        throw new RuntimeException("Stub!");
    }

    public int getIconMaxWidth() {
        throw new RuntimeException("Stub!");
    }

    public int getIconMaxHeight() {
        throw new RuntimeException("Stub!");
    }

    public void reportShortcutUsed(String shortcutId) {
        throw new RuntimeException("Stub!");
    }

demo代码:

ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

        ShortcutInfo shortcut1 = new ShortcutInfo.Builder(this,"id1")
                .setShortLabel("short label1")
                .setLongLabel("long label1")
                .setRank(4)
                .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
                .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com")))
                .build();
        ShortcutInfo shortcut2 = new ShortcutInfo.Builder(this,"id2")
                .setShortLabel("short label2")
                .setLongLabel("long label2")
                .setRank(3)
                .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
                .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com")))
                .build();
        ShortcutInfo shortcut3 = new ShortcutInfo.Builder(this,"id3")
                .setShortLabel("short label3")
                .setLongLabel("long label3")
                .setRank(2)
                .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
                .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com")))
                .build();
        ShortcutInfo shortcut4 = new ShortcutInfo.Builder(this,"id4")
                .setShortLabel("short label4")
                .setLongLabel("long label4")
                .setRank(1)
                .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
                .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com")))
                .build();
        ShortcutInfo shortcut5 = new ShortcutInfo.Builder(this,"id5")
                .setShortLabel("short label5")
                .setLongLabel("long label5")
                .setRank(2)
                .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
                .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com")))
                .build();

        shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut1,shortcut2,shortcut3,shortcut4,shortcut5));

注:关于shortcuts数量的问题,虽然名义上能添加5个,添加第6个的时候会抛出异常,但是只会显示4个,用setRank能改变显示的顺序(从小到大,不支持负数,数越小,离icon约近)

使用过程中处理back的问题,即多个Intent构建back stack的问题

ShortcutInfo shortcut5 = new ShortcutInfo.Builder(this,"id5")
                .setShortLabel("short label5")
                .setLongLabel("long label5")
                .setRank(2)
                .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
                .setIntents(new Intent[]{new Intent(Intent.ACTION_MAIN, Uri.EMPTY, this, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),
                        new Intent(Main2Activity.ACTION_SS)})
                .build();
<activity
            android:name=".Main2Activity"
            android:label="@string/title_activity_main2"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="com.dahuatech.shortcuts.ddd"/>

                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

注:target activity必须要用action启动

静态方式

  <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>
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:enabled="true"
        android:icon="@drawable/ic_check_circle_black_24dp"
        android:shortcutDisabledMessage="@string/static_shortcut_disabled_message"
        android:shortcutId="static"
        android:shortcutLongLabel="@string/static_shortcut_long_label_1"
        android:shortcutShortLabel="@string/static_shortcut_short_label_1">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.ddmeng.hellonougat.shortcuts.StaticShortcutActivity"
            android:targetPackage="com.ddmeng.hellonougat" />
    </shortcut>
    <shortcut
        android:enabled="true"
        android:icon="@drawable/ic_android_black_24dp"
        android:shortcutDisabledMessage="@string/static_shortcut_disabled_message"
        android:shortcutId="static_2"
        android:shortcutLongLabel="@string/static_shortcut_long_label_2"
        android:shortcutShortLabel="@string/static_shortcut_short_label_2">
        <intent
            android:action="android.intent.action.MAIN"
            android:targetClass="com.ddmeng.hellonougat.MainActivity"
            android:targetPackage="com.ddmeng.hellonougat" />
        <intent
            android:action="com.ddmeng.hellonougat.action.STATIC_SHORTCUT_2"
            android:targetClass="com.ddmeng.hellonougat.shortcuts.StaticShortcutActivity"
            android:targetPackage="com.ddmeng.hellonougat" />
    </shortcut>
</shortcuts>

上面这个文件里添加了两个静态的shortcuts, 第一个关联了一个Activity, 点击shortcut将直接打开这个Activity, 回退的时候回到桌面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值