Android 长按APP图标弹出快捷方式(shortcuts)

Android 长按APP图标弹出快捷方式(shortcuts)_第1张图片

今天给大家分享一份关于Android 7.1版本的一个新特性 Shortcut
它是谷歌在Api Level 25提出来的 类似苹果3D touch 但是没有压力感应.在安卓中完全就是长按
某些APP图标就会弹出菜单,如下表:

Android 长按APP图标弹出快捷方式(shortcuts)_第2张图片 Android 长按APP图标弹出快捷方式(shortcuts)_第3张图片

       相信大家在使用7.1版本以及7.1版本以上的android手机的时候,在不小心长按的时候,都会触发如上表中的功能。查阅完系统更新的文档才知道该功能叫做App Shortcuts

       其实这个长按桌面图标展示快捷方式已经普及很多App了,一是Android很早的版本就已经支持,二是大部分的应用也已经实现,像微信,支付宝,头条等,所以我们也要赶紧跟紧迭代的脚步,等自己遇到的时候,也能快速解决!

App Shortcuts该如何实现?

其实查阅系统文档,可知有两种方式可以实现shortcuts:

  1. 静态形式:在APK中包含一个资源文件来描述Shortcut。这种注册方法将导致:如果你要更新Shortcut,你必须更新整个应用程序
    目前,每个应用最多可以注册5个Shortcuts,无论是动态形式还是静态形式。
  2. 动态形式:在运行时,通过ShortcutManager
    API来进行注册。通过这种方式,你可以在运行时,动态的发布,更新和删除Shortcut。

静态写法:

静态写法?说白了和BroadcastReceiver(广播接受者)一样 .可以在清单文件中注册

静态运行效果如下:

Android 长按APP图标弹出快捷方式(shortcuts)_第4张图片

(1)首先, 我们需要在res/xml目录下创建一个新的xml文件, 这里我们命名为shortcuts.xml

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <!--
        android:enabled  shortcut是否可用
        android:icon  快捷图标
        android:shortcutId  快捷方式唯一的id
        android:shortcutShortLabel  短名称
        android:shortcutLongLabel  这里是配置的长名称, launcher会优先选择长名称显示,显示不下会选择短名称

        android:action    android.intent.action.VIEW
        android:targetClass  要跳转到哪个目标类
        android:targetPackage  指定一个目标应用的包名
        categories  android.shortcut.conversation
    -->
    <shortcut
        android:enabled="true"
        android:icon="@drawable/mine_img"
        android:shortcutId="MyMine"
        android:shortcutShortLabel="@string/mine">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.harry.shortcuts.MineActivity"
            android:targetPackage="com.harry.shortcuts" />
        <categories android:name="android.shortcut.conversation" />
        <capability-binding android:key="actions.intent.CREATE_MESSAGE" />
    </shortcut>

    <shortcut
        android:enabled="true"
        android:icon="@drawable/collection_img"
        android:shortcutId="MyCollection"
        android:shortcutShortLabel="@string/collection">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.harry.shortcuts.CollectionActivity"
            android:targetPackage="com.harry.shortcuts" />
        <categories android:name="android.shortcut.conversation" />
        <capability-binding android:key="actions.intent.CREATE_MESSAGE" />
    </shortcut>
</shortcuts>

(2)清单文件AndroidManifest里进行配置,这个需要注意一下:只能在有action是android.intent.action.MAIN和category是android.intent.category.LAUNCHER的Activity中配置才有效,说简单点,也就是应用的主入口。

		<meta-data android:name="android.app.shortcuts"
                android:resource="@xml/shortcuts"/>
Android 长按APP图标弹出快捷方式(shortcuts)_第5张图片

动态写法:

动态快捷键应提供指向您应用程序中特定的上下文相关操作的链接。这些操作可以在您的应用程序使用之间更改,即使应用程序正在运行,它们也可以更改。 动态快捷方式的好候选包括调用特定人员,导航到特定位置,以及查看特定游戏的当前分数。

ShortcutManager API允许你完成动态快捷键下面的操作:

  • 动态添加:使用setDynamicShortcuts()重新定义的动态快捷键的完整列表,或者使用addDynamicShortcuts()以增加动态快捷键的现有列表。
  • 动态移除:删除使用一组动态的快捷键removeDynamicShortcuts()或使用删除所有动态快捷键removeAllDynamicShortcuts()
  • 动态更新:使用updateShortcuts()方法。
动态运行效果如下:

//获取ShortcutManager对象
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

动态添加:

 	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1){
             //ShortcutInfo.Builder构建快捷方式
             ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "test_add")
                          .setShortLabel(getString(R.string.app_test_add))
                          .setIcon(Icon.createWithResource(this, R.drawable.add_img))//设置快捷图标

            			 //跳转到百度网页
//                       .setIntent(new Intent(Intent.ACTION_VIEW,
//                       Uri.parse("https://www.baidu.com/")))

                         //跳转的目标,定义Activity
                         .setIntent(new Intent(Intent.ACTION_MAIN, null, this, MainActivity.class))
                         .build();

              //setDynamicShortcuts()方法来设置快捷方式
              shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));

              Toast.makeText(MainActivity.this, "已添加", Toast.LENGTH_SHORT).show();
     }

动态更新:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
          Intent intent2 = new Intent();
          intent2.setAction("android.intent.action.MAIN");
          intent2.setClassName(getPackageName(),getPackageName()+".MainActivity.java");

		 /**
          * 构建ShortcutInfo时指定相同的id,根据id去找到要更新的快捷方式
          *
          * 注意:唯一的id标识不可传入一个静态快捷方式的id
          * 否则会抛出异常 应用会抛出错误:Manifest shortcut ID=XX may not be manipulated via APIs
          */
          ShortcutInfo info = new ShortcutInfo.Builder(this,"test_add")
                  .setIntent(intent2)
                  .setLongLabel("动态更新的长名")
                  .setShortLabel("动态更新的短名")
                   .build();
         shortcutManager = getSystemService(ShortcutManager.class);
         List<ShortcutInfo> dynamicShortcuts = shortcutManager.getDynamicShortcuts();
         
		 //updateShortcuts(List<ShortcutInfo> shortcutInfoList)方法更新现有的快捷方式
         shortcutManager.updateShortcuts(Arrays.asList(info));

         Toast.makeText(MainActivity.this, "已更新", Toast.LENGTH_SHORT).show();
 }

动态移除:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {

       /**
        * removeDynamicShortcuts(List<String> shortcutIds)方法可以删除动态快捷方式
        *
        * 同理,在唯一标识id和动态更新处理一样,需传入动态快捷方式的id,要不然会报同样的错误
        */
       shortcutManager.removeDynamicShortcuts(Arrays.asList("test_add"));//唯一的id标识

       Toast.makeText(MainActivity.this, "已移除", Toast.LENGTH_SHORT).show();
}

总结

希望通过这篇文章大家能够了解,并且能合理应用App Shortcuts,欢迎大家共同留言探讨!

项目地址:AndroidShortcuts

你可能感兴趣的:(开发技巧,Android,机型,android,android,studio)