你知道安卓的3D Touch吗?(Shortcut详解,你想知道的我都有)

来龙去脉

苹果在iPhone 6s和iPhone 6s Plus开始新增了3D Touch,这个功能褒贬不一,但我以为仍是特别好用的,特别是在微信上付款、加好友、扫二维码,或是在支付宝上付款等等场景。好用的真的是不要不要的,下面是苹果3D Touch的截图:html

这么好用的功能安卓能不模仿吗?呸!能不实现吗?java

从安卓7.1(25)开始,系统新增了Shortcut来实现相似苹果3D Touch的功能,实现效果以下:android

苹果的3D Touch是经过检测手指按压力度来判断是否弹出,安卓硬件没办法统一,因此统一采用长按的方式来实现。web

开始实现

实现呢,一共有三种方式,安卓官方是这样来描述的:浏览器

我就用官方直译来翻译下凑合理解吧:服务器

建立快捷方式

快捷方式可帮助用户快速访问应用程序的各个部分,从而为用户提供特定类型的内容。微信

使用快捷方式交付内容的方式取决于您的用例以及快捷方式的上下文是应用程序驱动仍是用户驱动。尽管静态快捷方式的上下文不会更改,而动态快捷方式的上下文会不断更改,可是在两种状况下,上下文都是由您的应用程序驱动的。若是用户选择本身但愿您的应用向其交付内容的方式(例如固定快捷方式),则上下文由用户定义。如下方案演示了每种快捷方式类型的一些用例:app

  • 静态快捷方式 最适合在用户与应用程序互动的整个生命周期中使用一致结构连接到内容的应用程序。因为大多数启动器一次 只能显示四个快捷方式,所以静态快捷方式对于常见活动颇有用。例如,若是用户但愿以特定方式查看其日历或电子邮件,则使用静态快捷方式可确保他们执行例行任务的经验是一致的。
  • 动态快捷键 用于上下文相关的应用程序中的操做。例如,若是您构建的游戏容许用户在启动时从其当前级别开始,则快捷方式将须要常常更新。使用动态快捷方式容许每次用户清除级别时更新该快捷方式。
  • 固定的快捷方式 用于特定的,用户驱动的操做。例如,用户可能想要将特定网站固定到启动器。这是有好处的,由于与使用浏览器的默认实例相比,它使用户能够更快地执行自定义操做,例如一步导航到网站。

 

静态快捷方式

一、在AndroidManifest.xml中找见你的启动项Activity,在其中添加一个元素,该元素引用定义了应用程序快捷方式的资源文件:ide

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

二、上面的shortcuts文件详情以下,其中定义了基本参数和意图:性能

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:enabled="true"
        android:icon="@drawable/one"
        android:shortcutDisabledMessage="@string/static_disabled_message"
        android:shortcutId="staticId"
        android:shortcutLongLabel="@string/static_shortcut_long_label"
        android:shortcutShortLabel="@string/static_shortcut_short_label">
        <categories android:name="android.shortcut.conversation" />
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.zj.shortcut.Main2Activity"
            android:targetPackage="com.zj.shortcut" />
    </shortcut>
</shortcuts>

三、上面的文件中有不少的属性,下面来一一讲解一下:

  • android:shortcutId 和 android:shortcutShortLabel 是必填值,其余都是可选的。 
  • android:shortcutId 字符串文字,表示对象对其执行操做时的快捷方式。
  • android:shortcutShortLabel 简短的描述,描述了快捷方式的用途。尽量将快捷方式的“简短描述”的长度限制为10个字符,否则在手机上显示效果可能不太好。
  • android:shortcutLongLabel  描述该快捷方式用途的扩展短语。若是有足够的空间,启动器将显示此值而不是上面的简短的描述。若是可能,将快捷方式的“详细描述”的长度限制为25个字符。
  • android:shortcutDisabledMessage  当用户尝试启动禁用的快捷方式时,在受支持的启动器中显示的消息。该消息应向用户说明为何如今禁用了快捷方式。若是android:enabled为,则此属性的值无效true
  •  android:enabled   肯定用户是否能够与受支持的启动器中的快捷方式进行交互。默认值android:enabledtrue。若是将其设置为false,则还应该设置一个android:shortcutDisabledMessage,以说明为何禁用了快捷方式。若是您不须要提供这样的消息,则最简单的方法是从XML文件中彻底删除快捷方式。
  • android:icon   启动器在向用户显示快捷方式时使用 的位图 或 自适应图标。该值能够是图像的路径,也能够是包含该图像的资源文件。尽量使用自适应图标来提升性能和一致性。

四、上面的字符串都定义在了res->value->string.xml中,下面是代码:

<string name="static_disabled_message">测试信息</string>
    <string name="static_shortcut_long_label">测试长标题</string>
    <string name="static_shortcut_short_label">测试短标题</string>

五、下面来看一下静态展现安卓的“3D Touch”:

 

动态快捷方式

      一、动态快捷键提供了指向应用程序中特定于上下文的特定操做的连接。这些操做可能会在您的应用使用之间发生变化,甚至在应用运行时也会发生变化。动态快捷方式的选择包括呼叫特定人员,导航至特定位置以及从用户的最后保存点加载游戏等等。

这是ShortcutManagerAPI的地址https://developer.android.google.cn/reference/android/content/pm/ShortcutManager.html

      二、下面是动态添加快捷方式的代码(注意要加版本注解):

@TargetApi(Build.VERSION_CODES.N_MR1)
    @RequiresApi(Build.VERSION_CODES.M)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val shortcutManager = getSystemService<ShortcutManager>(ShortcutManager::class.java)

        val shortcut = ShortcutInfo.Builder(this, "id1")
            .setShortLabel("Website")
            .setLongLabel("Open the website")
            .setIcon(Icon.createWithResource(this, R.drawable.ic_launcher_background))
            .setIntent(
                Intent(
                    Intent.ACTION_VIEW,
                    Uri.parse("https://www.baidu.com/"))
            )
            .build()

        shortcutManager!!.dynamicShortcuts = listOf(shortcut)

    }

      三、下面是添加完以后运行界面样式:

 

固定快捷方式

在Android 8.0(API级别26)及更高版本上,能够建立固定的快捷方式。与静态和动态快捷方式不一样,固定的快捷方式在支持的启动器中显示为单独的图标。图1显示了这两种快捷方式之间的区别。

屏幕截图显示了应用程序快捷方式和固定快捷方式之间的对比

      一、使用 isRequestPinShortcutSupported()验证应用程序内设备的默认启动支持快捷键。

      二、ShortcutInfo根据快捷方式是否已存在,以两种方式之一建立对象:

  • 若是快捷方式已经存在,请建立一个 ShortcutInfo仅包含现有快捷方式ID的对象。系统会自动查找并固定与快捷方式相关的全部其余信息
  • 若是要固定新的快捷方式,请建立一个ShortcutInfo对象,其中包含新快捷方式 的ID,意图和简短标签。
  • 注意:由于系统会自动对固定的快捷方式执行 备份和还原,因此这些快捷方式的ID应该包含稳定,恒定的字符串或服务器端标识符,而不是本地生成的标识符,这些标识符在其余设备上可能没有意义。

      三、经过调用将快捷方式固定到设备的启动器 requestPinShortcut()。在此过程当中,能够传入一个 PendingIntent对象,该对象仅在成功固定快捷方式后才通知应用。

           注意:若是用户不容许将快捷方式固定在启动器上,则您的应用不会收到回调。固定快捷方式后,可使用 updateShortcuts()方法更新其内容 。

      四、下面是建立固定快捷方式的代码:

@SuppressLint("NewApi")
    private fun initShortcut() {
        val shortcutManager = getSystemService(ShortcutManager::class.java)

        if (shortcutManager!!.isRequestPinShortcutSupported) {
            val pinShortcutInfo  = ShortcutInfo.Builder(this, "id1")
                .setShortLabel("Website")
                .setLongLabel("Open the website")
                .setIcon(Icon.createWithResource(this, R.drawable.ic_launcher_background))
                .setIntent(
                    Intent(
                        Intent.ACTION_VIEW,
                        Uri.parse("https://www.baidu.com/"))
                )
                .build()

            val pinnedShortcutCallbackIntent = shortcutManager.createShortcutResultIntent(pinShortcutInfo)

            val successCallback = PendingIntent.getBroadcast(this, /* request code */ 0,
                pinnedShortcutCallbackIntent, /* flags */ 0)

            shortcutManager.requestPinShortcut(pinShortcutInfo,
                successCallback.intentSender)
        }
    }

      五、运行结果以下:

 

文末

本文参照了官网Shortcut的介绍及使用,本文涉及全部代码都可联系我获取。

欢迎你们关注个人我的公众号,会按期发布安卓、Java学习及搞笑文章。