Android 7.1 App Shortcuts使用
Android 7.1 App Shortcuts使用
Android 7.1已经发了预览版, 这里是API Overview: API overview.
其中App Shortcuts是新提供的一种快捷访问方式, 形式为长按应用图标出现的长条.
图来自: Exploring Android Nougat 7.1 App Shortcuts
点击快捷方式可以访问应用功能, 并且这种快捷方式也可以被拖拽到桌面单独放置.
App Shortcuts 是什么
其中App Shortcuts是指在桌面长按app图标而出现的快捷方式, 可以为你的app的关键功能添加更快速的入口而不用先打开app.
点击快捷方式可以访问应用功能, 并且这种快捷方式也可以被拖拽到桌面单独放置, 变成单独的桌面快捷方式(pinned shortcuts).
有两种shortcuts:
- 静态的: 在xml中定义, 适用于一些通用的动作.
- 动态的: 由ShortcutManager发布, 可以根据用户的行为或者偏好添加, 可以动态更新.
每一个应用目前最多可以有5个shortcuts(静态 + 动态).
运行条件:
应用添加App Shortcuts是Android 7.1(API 25)的API, 所以只能在Android 7.1的设备上显示, 同时需要launcher支持, 比如Pixel launcher(Pixel设备的默认launcher), Now launcher(Nexus设备上的launcher)现在就支持, 其他launcher也可以提供支持.
静态Shortcuts使用
静态的Shortcuts是写在xml中的, 直到下一次应用升级, 不能被改变.
要添加静态shortcuts只需两步:
首先, 在应用的Manifest中启动Activity上添加<meta-data>
:
<activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-dataandroid:name="android.app.shortcuts"android:resource="@xml/shortcuts" /></activity>
然后在res/xml/
目录下创建shortcuts.xml
文件, 里面包含静态的shortcuts:
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"><shortcutandroid: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"><intentandroid:action="android.intent.action.VIEW"android:targetClass="com.ddmeng.hellonougat.shortcuts.StaticShortcutActivity"android:targetPackage="com.ddmeng.hellonougat" /></shortcut><shortcutandroid: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"><intentandroid:action="android.intent.action.MAIN"android:targetClass="com.ddmeng.hellonougat.MainActivity"android:targetPackage="com.ddmeng.hellonougat" /><intentandroid:action="com.ddmeng.hellonougat.action.STATIC_SHORTCUT_2"android:targetClass="com.ddmeng.hellonougat.shortcuts.StaticShortcutActivity"android:targetPackage="com.ddmeng.hellonougat" /></shortcut>
</shortcuts>
这就好了, 这个文件添加了两个shortcuts, 点击都将打开指定的Activity, 本例子中是StaticShortcutActivity
.
用多个Intent构建back stack
上面这个文件里添加了两个静态的shortcuts, 第一个关联了一个Activity, 点击shortcut将直接打开这个Activity, 回退的时候回到桌面.
如果你想要的效果是点击back键回到应用里的某个界面, 那么可以利用多个intents来构建back stack, 比如在第二个shortcut里面, 点击shortcut还是打开目标Activity, 这个指定目标Activity的Intent放在最后, 但是回退会返回到MainActivity, 即之前的那个Intent.
动态Shortcuts使用
动态的shortcuts可以在用户使用app的过程中构建, 更新, 或者删除.
使用ShortcutManager可以对动态shortcuts完成下面几种操作:
- Publish发布:
setDynamicShortcuts()
,addDynamicShortcuts(List)
; - Update更新:
updateShortcuts(List)
; - Remove删除:
removeDynamicShortcuts(List)
,removeAllDynamicShortcuts()
.
比如添加一个动态shortcut:
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "id1").setShortLabel("Web site").setLongLabel("Open the web site").setIcon(Icon.createWithResource(context, R.drawable.icon_website)).setIntent(new Intent(Intent.ACTION_VIEW,Uri.parse("https://www.mysite.example.com/"))).build();shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));
点击这个shortcut会发出一个打开网页的Intent, 让你选择浏览器, 从而打开网址.
多个Intent构建back stack
动态的shortcut仍然可以用多个Intent来指定一个back stack, 那么打开目标Activity之后就可以返回到应用中的指定界面而不是回到launcher:
ShortcutInfo dynamicShortcut2 = new ShortcutInfo.Builder(this, "shortcut_dynamic").setShortLabel("Dynamic Shortcut").setLongLabel("Open Dynamic shortcut 2").setIcon(Icon.createWithResource(this, R.drawable.ic_favorite_border_black_24dp)).setIntents(// this dynamic shortcut set up a back stack using Intents, when pressing back, will go to MainActivity// the last Intent is what the shortcut really openednew Intent[]{new Intent(Intent.ACTION_MAIN, Uri.EMPTY, this, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),new Intent(DynamicShortcutActivity.ACTION_OPEN_DYNAMIC)// intent's action must be set}).build();
和静态一样, 最后一个Intent对应的是shortcut打开的界面DynamicShortcutActivity
, 前面的都是用来构建back stack, 即back退回到MainActivity.
注意这里的Intent必须指定Action, 否则会抛出异常.
Shortcuts的个数限制
Shortcuts的总数不能超过5个, 即静态和动态shortcuts加起来总数最多是五个.
当我们尝试添加第六个shortcut时, 应用会抛出异常: java.lang.IllegalArgumentException: Max number of dynamic shortcuts exceeded
.
虽然总数限制是5个, 但是当我正好有5个(2个静态 + 3个动态)的时候, 长按只显示了4个shortcuts.
如图:
本文完整代码见: Demo地址: HelloNougat.
Shortcuts的次序
当我们有多个Shortcuts之后, 默认它们是按照添加顺序排列的, 即按照添加顺序rank递增.
可以通过setRank()
来改变长按时它们显示的排序:
@TargetApi(25)
private void updateDynamicShortcuts() {ShortcutInfo webShortcut = new ShortcutInfo.Builder(MainActivity.this, "shortcut_blog").setRank(1).build();ShortcutInfo dynamicShortcut = new ShortcutInfo.Builder(MainActivity.this, "shortcut_dynamic").setRank(0).build();// the rank value can not be set to negative, otherwise will throw// java.lang.IllegalArgumentException: Rank cannot be negative or bigger than MAX_RANK// the static shortcuts have the rank 0, so they will always be closest to launcher iconshortcutManager.updateShortcuts(Arrays.asList(webShortcut, dynamicShortcut));
}
这样更改之后, 原先排在最远端的shortcut_dynamic
被移到了第三个, shortcut_blog
被移到了它的后面.
setRank()
不接受负值, 会抛出异常.
我们只能改变动态shortcuts的排序, 静态的shortcuts等级为0, 它们是按照xml中写定的先后顺序排的, 所以:
静态的shortcuts永远离应用icon最近, 动态shortcuts在其之上排序, rank越大的离应用icon越远.
如果没有指定rank, 则按生成的顺序递增.
参考
App Shortcuts的官方文档: App Shortcuts
Exploring Android Nougat 7.1 App Shortcuts
Demo地址: HelloNougat.
近期考虑加入更多Android 7 Nougat特性sample.
最后, 欢迎关注微信公众号: 圣骑士Wind
Android 7.1 App Shortcuts使用相关推荐
- android 7.1快捷方式App Shortcuts
App Shortcuts 功能描述 仅支持Android 7.1 (API level 25)及以上版本 Shortcut静态和动态的总和不能超过5个,但目前仅支持4个 一.静态注册: 1.创建re ...
- Android App Shortcuts
周五了,周末还远吗?~ 加入我知识星球的人都得到了提升,可不要错过哦~ 点击阅读原文即可. 本文较长,阅读大约十分钟 ~ 我们都知道iPhone6S推出了3D Touch的功能,也算是一个大卖点,Go ...
- Android 长按APP图标弹出快捷方式(shortcuts)
今天给大家分享一份关于Android 7.1版本的一个新特性 Shortcut 它是谷歌在Api Level 25提出来的 类似苹果3D touch 但是没有压力感应.在安卓中完全就是长按 某些APP ...
- App Shortcuts
编辑于2018年9月7日 如果您的应用定位到Android 7.1(API级别25)或更高版本,则可以为应用中的特定操作定义快捷方式. 这些快捷方式可以显示在支持的启动器中. 快捷方式可让您的用户快速 ...
- Android如何更新app的版本(中级)
Android如何更新app的版本(中级) 版本更新 看看我们要用到哪些技术1 自定义通知栏 2 HTTP 下载 3 AsyncTask 4 刷新通知栏中的进度条 5 执行 apk安装的隐士意图 6 ...
- 【Android】 01. APP 进程启动和 ActivityThread 的关系
2019独角兽企业重金招聘Python工程师标准>>> 首先我们应该知道2个概念: 我们应该知道在Android中一个app就是一个进程: 我们在普通的Java程序中一个程序的入口是 ...
- Android Jetpack组件App Startup简析
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Program type already present: android.support.v4.app.BackStackRecord$Op
Program type already present: android.support.v4.app.BackStackRecord$Op 原文:https://blog.csdn.net/zww ...
- android app系统的测试_计算机毕设项目003之基于Android系统的App点餐外送系统
计算机毕设项目之基于Android系统的App点餐外送系统 一. 项目名称 基于Android系统的App点餐外送系统 二. 项目简介 本项目是基于Android系统的手机点餐系统,整个项目分为App ...
最新文章
- tcpdf html 格式重叠,html - tcpdf(html2pdf)无法正确生成表格边框 - 堆栈内存溢出...
- storyboard和xib的区别
- [asp.net] 获取网页访问来路的几种方法
- vaadin_Vaadin Flow –奇妙的鹿
- 周鸿祎回顾IPO一周年:保持创业心态 看好无线
- [笔记][原创]Verilog HDL语法分析笔记
- java输入最大10位数,倒数输出(很鸡肋)
- 一款纯HTML二次元响应式引导页
- 汉字笔顺动画技术剖析,android应用开发实战
- AmazeUI 离线文档
- GZHU - 1523 疯狂钻石 (完全背包)
- 服务器信号标识是什么意思,手机信号栏的这些“符号”是什么意思,你知道吗?...
- MySQL 百分比排序
- 王道考研计算机网络第三章--数据链路层
- iOS杂谈15—APP被苹果APPStore拒绝的各种原因
- 整理了100个软硬件都要懂的示波器基础知识
- 《论语》原文及其全文翻译 学而篇1
- 【专家观点】超大规模数据要素市场体系下数据价格生成机制研究
- SpringSecurity:登录
- matlab 图像分割库,图像分割Matlab代码
热门文章
- 【PostgreSQL-9.6.3】约束
- 解决误删/bin/bash问题
- centos 解决“不在 sudoers 文件中。此事将被报告“的问题
- 关于腾讯云redis 无法外网访问的解决方案
- 前台ajax请求php后台返回成功却进error方法解决
- 如何从javascript检索GET参数? [重复]
- 在Java中安全地将long转换为int
- Normalize.css和Reset CSS有什么区别?
- activiti处理当前用户的任务
- 海信CAS计算机辅助手术系统,计算机辅助手术系统(CAS)