自Android 7.1.1 (即API = 25)开始支持shortcuts快捷方式,有点类似iphone 的 3D touch功能,在桌面长按app,会弹出一个菜单,其中有几个事先定义好的菜单,当然还有分享和卸载,它的存在就是为了让用户在不打开app的情况下快速启动app内的其他功能模块,比如说扫一扫、历史记录、全局搜索、热门相册、拍照识花等一些常用功能
这类快捷方式需要用户长按App图标才会弹出,可以对它执行的操作包括:添加、删除、更新、禁用。
顾名思义,是把App宿主图标放在右下角的快捷方式,它是怎么产生的呢,是在App快捷方式弹出来的前提下,用户再长按某一个快捷方式,按住拖动到桌面空白处即可产生角标快捷方式,对它执行的操作包括:添加、更新,此类快捷方式无法通过代码删除,只能用户长按移除!Android8.0,系统才支持增加禁用角标快捷方式,
1、gradle.properties中添加androidx支持
android.useAndroidX=true
android.enableJetifier=true
2、执行菜单重构 > 迁移到AndroidX
类似广播一样,可以静态xml实现,也可以用java代码动态实现
1、在res目录下新建一个目录,名叫xml,在这个xml目录下新建一个xml文件,名叫shortcuts.xml文件,在其中添加shortcut标签对,最多可添加 4 个,顺序添加,在app长按时就是逆序显示
首先来解释一下其中的几个属性含义
注意这里的intent可以是多个
如果你的快捷方式与多个意图相关联,请将它们添加到这里,列表中的最后一个意图决定了用户最先看到的内容。
如果你的快捷方式与多个意图相关联,系统将在资源文件中启动与该快捷方式的最后一个意图相对应的活动,
并在后方堆栈中执行其他活动 。在这种情况下,当用户选择快捷方式然后按下后退键时,您的应用程序将启
动与资源文件中列出的快捷方式的倒数第二个意向对应的活动。这种行为模式会一直重复按下后退按钮,直
到用户清除快捷方式创建的后台堆栈。当用户下一次按下后退按钮时,系统将其导航回启动器。
https://blog.csdn.net/MakerCloud/article/details/80842491
然后看一下其中string.xml下面的文字引用
短按1
长名称显示不下就用短名称1
无效1
短按2
长名称显示不下吗2
无效2
2、到全局清单配置文件中添加声明这个shortcuts
注意:这里只能添加到入口类这个activity里
3、最后,到桌面长按app图标看效果
注意:如果manifest配置了shortcuts.xml,那么会优先显示静态,只有静态快捷方式图标不满足最大数量时,才会去加载动态快捷方式
对动态快捷方式的操作又增加、删除、修改、查询,简称CRUD,就跟操作sql语句一样
添加角标快捷方式
shortcutManager.requestPinShortcut(ShortcutInfo info, PendingIntent.getIntentSender() intentSender);
添加App快捷方式
shortcutManager.addDynamicShortcuts(List infoList);
让某些快捷方式无效
shortcutManager.disableShortcuts(Arrays.asList(shortcutInfo.getId()), "暂无该快捷方式");
移除某些快捷方式
shortcutManager.removeDynamicShortcuts(Arrays.asList(shortcutInfo.getId()));
作者注:我觉得remove方法和disable方法都是让某些快捷方式失效,实验下来,发现确实是这样
shortcutManager.updateShortcuts(Arrays.asList(info));
获取App快捷方式列表
List shortcutInfoList = shortcutManager.getDynamicShortcuts();
获取角标快捷方式列表
List shortcutInfoList = shortcutManager.getPinnedShortcuts();
package com.xmliu.myshortcutsdemo;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity {
ShortcutManager shortcutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
shortcutManager = getSystemService(ShortcutManager.class);
shortcutManager.getDynamicShortcuts();
Button delete = findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// addPinnedShortcuts("xml2);
// updateDynamicShortcuts("xml2");
// removeItem("xml2");
// removeShortcut("xml2");
deletePinnedShortcut("xml2");
}
});
initShortcuts();
}
/**
* 设置快捷方式
*/
private void initShortcuts() {
List menuList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
ShortItem item = new ShortItem();
item.setShort_id("xml" + i);
item.setShort_name("张" + i);
item.setLong_name("同学:张" + i);
item.setRes(Icon.createWithResource(this, R.mipmap.ic_launcher));
menuList.add(item);
}
List infoList = new ArrayList<>();
for (int i = 0; i < shortcutManager.getMaxShortcutCountPerActivity(); i++) {
ShortItem item = menuList.get(i);
Intent intent = new Intent(this, SecondActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("msg", "来自" + item.getShort_name() + "的视频通话邀请");
ShortcutInfo info = new ShortcutInfo.Builder(this, item.getShort_id())
.setShortLabel(item.getShort_name())
.setLongLabel(item.getLong_name())
.setIcon(item.getRes())
.setIntent(intent)
.build();
infoList.add(info);
}
shortcutManager.setDynamicShortcuts(infoList);
}
/**
* 删除功能1
*
* @param sid
*/
private void removeItem(String sid) {
List list = shortcutManager.getPinnedShortcuts();
for (ShortcutInfo shortcutInfo : list) {
if (shortcutInfo.getId().equals(sid)) {
shortcutManager.disableShortcuts(Arrays.asList(shortcutInfo.getId()), "暂无该快捷方式");
}
}
// shortcutManager.removeDynamicShortcuts(Arrays.asList(sid));
}
/**
* 删除功能2
*
* @param shortId
*/
private void removeShortcut(String shortId) {
List infoList = shortcutManager.getDynamicShortcuts();
String shortcutId = null;
for (ShortcutInfo shortcutInfo : infoList) {
if (shortId.equals(shortcutInfo.getId())) {
shortcutId = shortcutInfo.getId();
}
}
if (shortcutId == null) {
Toast.makeText(this, "快捷方式不存在", Toast.LENGTH_SHORT).show();
} else {
List list = new ArrayList<>();
list.add(shortcutId);
// shortcutManager.removeDynamicShortcuts(list);
shortcutManager.disableShortcuts(list, "暂无该同事");
Toast.makeText(this, "删除快捷方式成功", Toast.LENGTH_SHORT).show();
}
}
/**
* 删除功能3
* 禁用快捷方式(固定、动态、静态)
*/
private void deletePinnedShortcut(String shortId) {
List shortcutInfoList = shortcutManager.getPinnedShortcuts();
for (ShortcutInfo info : shortcutInfoList) {
Log.i("xunming", "ShortcutInfo:" + info.getId());
if (info.getId().equals(shortId)) {
List list = new ArrayList<>();
list.add(shortId);
shortcutManager.disableShortcuts(list, "快捷方式已失效");
}
}
}
/**
* 更新动态快捷键
*/
private void updateDynamicShortcuts(String shortId) {
List shortcutInfoList = shortcutManager.getDynamicShortcuts();
for (ShortcutInfo info : shortcutInfoList) {
if (info.getId().equals(shortId)) {
info = new ShortcutInfo.Builder(this, shortId)
.setShortLabel("Short" + System.currentTimeMillis())
.setLongLabel("Long" + System.currentTimeMillis())
.setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
.setIntent(new Intent(this, SecondActivity.class).setAction(Intent.ACTION_VIEW))
.build();
shortcutManager.updateShortcuts(Arrays.asList(info));
}
}
}
/**
* 添加固定快捷方式 可以添加多个,但如果仅添加一个的话建议每次添加前查看已添加的固定快捷键列表
*/
private void addPinnedShortcuts(String shortId) {
List shortcutInfoList = shortcutManager.getPinnedShortcuts();
for (ShortcutInfo info : shortcutInfoList) {
Log.i("xunming", "ShortcutInfo:" + info.getId());
}
if (shortcutManager.isRequestPinShortcutSupported()) {
ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(this, shortId).build();
Intent pinnedShortcutCallbackIntent = shortcutManager.createShortcutResultIntent(pinShortcutInfo);
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0, pinnedShortcutCallbackIntent, 0);
shortcutManager.requestPinShortcut(pinShortcutInfo, successCallback.getIntentSender());
}
}
}