Android 桌面的二级菜单Shortcut 实现

写在前面的话

本文在http://blog.csdn.net/qibin0506/article/details/52878690上进行补充。
Google官方文档:https://developer.android.google.cn/guide/topics/ui/shortcuts.html
如果您的应用的目标是Android 7.1(API级别25)或更高,则可以在应用中定义 快捷方式以适应特定操作。快捷方式可让您的用户在应用内快速启动常用或推荐的任务。显示如图

image

静态使用 Shortcut

1.res/xml/ 下新建一个xml 文件,此处取名为mandroid.xml
eq:

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:enabled="true" //该二级菜单是否可用
        android:icon="@mipmap/xiansuo" //显示的图标
        android:shortcutDisabledMessage="@string/quxian"//不可用时显示的文字
        android:shortcutId="settings"//唯一id 
        android:shortcutLongLabel="@string/settings_long_name" //长名字
        android:shortcutShortLabel="@string/settings_short_name">//短名字

        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.gray.quxian.TestActivity"
            android:targetPackage="com.gray.quxian" />
        <categories android:name="android.shortcut.conversation" />
    </shortcut>
</shortcuts>

外部标签为<shortcuts>,内部标签为<shortcut>.如果有多个菜单的话,就写平级的<shortcut>标签。
intent 的 targetPackage要和manifest 的包名一致,targetClass的值为目标页面值,<categories>的标签内的 name 值是固定的。

2.配置清单文件
在程序的主入口下配置<meta-data>并且name的值固定,resource的值为之前的创建的xml文件

<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>

动态创建 Shortcut

shortcut的代码创建方式要比静态创建方式复杂些,但是方便我们更新迭代,所以要更加常用些。下面我们就来学习如何代码动态设置shortcut

1.初始化shortcut

/**
 * 初始化shortcut
 */
 //初始化shortManager
ShortcutManager mSystemService;
mSystemService = getSystemService(ShortcutManager.class);
List<String> mTitle = new ArrayList<>();

private void initShortsCut() {
    List<ShortcutInfo> dynamicShortcuts = new ArrayList<>();
    
    //动态设置及添加shortcut 其中getMaxShortCutCountPerActivity的值是5所以mTitle的值不要少于5个,或者一个一个的初始化
    
    for (int i = 0; i < mSystemService.getMaxShortcutCountPerActivity(); i++) {
        Intent intent = new Intent(this, OtherActivity.class);
        intent.setAction(Intent.ACTION_VIEW);
        ShortcutInfo info = new ShortcutInfo.Builder(this, "id" + i)//设置id
                .setShortLabel(mTitle.get(i))//设置短标题
                .setLongLabel("功能:" + mTitle.get(i))//设置长标题
                .setIcon(Icon.createWithResource(this, R.mipmap.xiansuo))//设置图标
                .setIntent(intent)//设置intent
                .build();
        dynamicShortcuts.add(info);//将新建好的shortcut添加到集合
    }
    mSystemService.setDynamicShortcuts(dynamicShortcuts);//设置动态shortcut
}

2.更新shortcut
要通过id去更新shortcut

private void updataShortCut(int id) {
    Intent intent = new Intent(this, OtherActivity.class);//目标页面
    intent.setAction(Intent.ACTION_VIEW);
    ShortcutInfo info = new ShortcutInfo.Builder(this, id)
            .setShortLabel("已修改")//设置短标题
            .setLongLabel("功能:已修改修改")//设置长标题
            .setIcon(Icon.createWithResource(this, R.mipmap.fengji))//设置图标
            .setIntent(intent)
            .build();
    mSystemService.updateShortcuts(Arrays.asList(info));//更新shortcut
}

3.删除shortcut
如果app的功能点被迭代了删除了,那么该功能的shortcut的点击会出现崩溃的,我们需要让这个shortcut失效。同更新shortcut,都是通过id 进行操作。

/**
 * 删除已有功能后该二级菜单失效
 */
private void deleteShortCut(int index) {
    List<ShortcutInfo> infos = mSystemService.getPinnedShortcuts();
    //遍历出该id的shortcut
    for (ShortcutInfo info : infos) {
        if (info.getId().equals("id" + index)) {
            mSystemService.disableShortcuts(Arrays.asList(info.getId()), "暂无改功能");
        }
    }
    //动态删除该功能
    mSystemService.removeDynamicShortcuts(Arrays.asList("id" + index));
}

代码中删除shortcut之后,android home界面中的shortcut 就回被置灰,点击弹toastdisableShortcuts 的内容。

总结

shortcut 是 Android 7.0以后 google 新增的功能,体验类很棒,除了增加了应用功能的快速入口,没有其他影响,所以我觉得只要 app 适配了 7.0,8.0 ,这个功能就可以加上,提高用户的体验。本篇教学只是简单的教学,更深入的学习可以看文章开头的 google 文档,会有一些提高的。

更多内容,欢迎关注我的微信公众号 MAndroid ,定期发福利哦~~


image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,280评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 第一次看见你我虽有点懵,但再看见你是我对你怦然心动。初见顷心,再见动心,忘记不了你的面容,爱上你我不会错。 ...
    狂妄阅读 195评论 0 1
  • 当高考成绩闪现在屏幕上时,我的内心里没有预料中的激动与兴奋,有的只是平淡与冷静。反而感觉到一种解脱与释放。...
    陈陌沫阅读 533评论 8 6
  • 1. 斯里兰卡、马尔代夫的工程建设,很多交给了中国的公司。科伦坡繁华地段见到在建香格里拉二期,查了下是中国港湾在建...
    张振亚童鞋阅读 224评论 0 0