Android-ShortCut
2020-12-23 本文已影响0人
有腹肌的豌豆Z
shortcuts的介绍
其中App Shortcuts是指在桌面长按app图标而出现的快捷方式, 可以为你的app的关键功能添加更快速的入口而不用先打开app,点击快捷方式可以访问应用功能, 并且这种快捷方式也可以被拖拽到桌面单独放置, 变成单独的桌面快捷方式.
有两种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的使用
清单文件配置
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!--添加支持shortcuts-->
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
在res目录下添加xml文件夹,并新建文件shortcuts
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:icon="@drawable/add"
android:shortcutId="add_website"
android:shortcutLongLabel="@string/add_new_website"
android:shortcutShortLabel="@string/add_new_website_short">
<!--最左侧或者添加桌面后显示的图标-->
<!--id标识-->
<!--长按显示的文字-->
<!--添加到桌面显示的文字-->
<intent
android:action="cn.yky.test.ADD_WEBSITE"
android:targetClass="cn.yky.test.MainActivity"
android:targetPackage="cn.yky.test" />
<!--第一个是意图标识-->
<!--第二个参数是希望打开的界面-->
<!--希望打开界面的包名-->
</shortcut>
</shortcuts>
1、enabled:表示当前快捷方式是否可使用
2、 icon: 快捷方式图标
3、 shortcutDisabledMessage: 快捷方式不可使用时显示的名字
4、 shortcutId:快捷方式标识
5、 shortcutLongLabel:长按下图标弹出来列表框中每个快捷名
6、 shortcutShortLabel:快捷是可以单独显示在桌面上的,显示名为shortcutShortLabel
7、 targetClass:点击快捷方式进入的Activity
8、categories 默认写死即可
注意,shortcutLongLabel和shortcutShortLabel,不可以直接引用文字,不然会报错.!!!谁加谁知道.经过以上的 步骤之后,就可以看到最开始的效果图了!.
动态添加
动态的shortcuts可以在用户使用app的过程中构建, 更新, 或者删除.
ShortcutManager
- 设置或者新增 setDynamicShortcuts; addDynamicShortcuts;
- 设置桌面快捷 requestPinShortcut;
- 修改 updateShortcuts;
- 删除 removeDynamicShortcuts; removeAllDynamicShortcuts;
动态添加三个
@RequiresApi(api = Build.VERSION_CODES.O)
private void getNewShortcutInfo() {
// 系统提供的
ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
// 按下返回按钮跳转的activity
Intent intent1 = new Intent(this, MainActivity.class);
intent1.setAction(Intent.ACTION_VIEW);
// 目标activity
Intent intent2 = new Intent(this, PublishPostActivity.class);
intent2.setAction("com.shark.xxx.BACK");
Intent[] intents = new Intent[2];
intents[0] = intent1;
intents[1] = intent2;
// 一个具体的快捷对象
ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "id1") // id 标识是唯一的
.setShortLabel("Web site") // 桌面快捷方式显示的名字
.setLongLabel("第一个") // 长按弹窗显示的名字
.setIcon(Icon.createWithResource(this, R.mipmap.acc_circle)) // 显示的Icon
.setIntents(intents) // 意图设置
.build(); // 构建
ShortcutInfo shortcut2 = new ShortcutInfo.Builder(this, "id2")
.setShortLabel("Web site")
.setLongLabel("第二个")
.setIcon(Icon.createWithResource(this, R.mipmap.acc_circle))
.setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.csdn.com/")))
.build();
ShortcutInfo shortcut3 = new ShortcutInfo.Builder(this, "id3")
.setShortLabel("Web site")
.setLongLabel("第三个")
.setIcon(Icon.createWithResource(this, R.mipmap.acc_circle))
.setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.github.com/")))
.build();
// 创建长按快捷键
mShortcutManager.setDynamicShortcuts(Arrays.asList(shortcut, shortcut2, shortcut3));
// 创建桌面快捷键
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0, mShortcutManager.createShortcutResultIntent(shortcut), 0);
mShortcutManager.requestPinShortcut(shortcut,successCallback.getIntentSender());
}
禁用删除
/**
* 动态删除
*/
@RequiresApi(api = Build.VERSION_CODES.O)
public void delete() {
ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
/********* 移除弹出列表图标 **********/
// 所有动态创建图标
List<ShortcutInfo> infos1 = mShortcutManager.getDynamicShortcuts();
List<String> ids1 = new ArrayList<>();
for (ShortcutInfo info : infos1) {
ids1.add(info.getId());
}
// 禁用所有的快捷方式
mShortcutManager.disableShortcuts(ids1, "已禁用");
mShortcutManager.removeDynamicShortcuts(ids1);
/********* 移除拖出来的桌面快捷图标 **********/
// 放在桌面的图标
List<ShortcutInfo> infos2 = mShortcutManager.getPinnedShortcuts();
List<String> ids2 = new ArrayList<>();
for (ShortcutInfo info : infos2) {
ids2.add(info.getId());
}
mShortcutManager.disableShortcuts(ids2, "已禁用");
mShortcutManager.removeAllDynamicShortcuts();
}