1.Shortcut概念
Shortcut 是Android-25新增的一项类似iOS的 3D Touch 功能的快捷方式组件,但是有着不同的表现形式,因为Android在硬件上不支持触摸压力感应,所以表现形式为长按,而iOS须用力长按。
Android-26新增生成桌面图标方法。
2.快捷键静态配置
一. 在 res/xml 文件夹底下创建一个xml
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:enabled="true"
android:icon="@mipmap/ic_bar_detail_write"
android:shortcutDisabledMessage="@string/shortcut_publish"
android:shortcutId="publish"
android:shortcutLongLabel="@string/shortcut_publish"
android:shortcutShortLabel="@string/shortcut_publish">
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.yanshi.writing.ui.bar.PublishPostActivity"
android:targetPackage="com.yanshi.writing" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
</shortcuts>
二. 清单文件注册
在 AndroidMainfest.xml 的默认启动页里添加 meta-data 标签配置
<activity>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcut" />
</activity>
2.快捷键动态配置 版本大于25
ShortcutManager shortcutManager = (ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
List<ShortcutInfo> dynaShortcuts = new ArrayList<>();
ShortcutInfo.Builder builder = new ShortcutInfo.Builder(context, "shortcutID");
builder.setIcon(Icon.createWithResource(context, icon)); //设置图标
builder.setShortLabel(title); //设置短标题
builder.setLongLabel(longTitle); //设置长标题
builder.setIntent(IntentUtil.openActionIntent("action", "包名", "类名"));
builder.setCategories(new TreeSet<String>() {
{
this.add("android.shortcut.conversation");//现在唯一表示配置
}
});
dynaShortcuts.add(builder.build());
shortcutManager.addDynamicShortcuts(dynaShortcuts); //添加动态的shortcuts
List<ShortcutInfo> shortcutInfos = shortcutManager.getPinnedShortcuts(); //获得所有pin shortcut
List<ShortcutInfo> shortcutInfos = shortcutManager.getDynamicShortcuts(); //获得所有dynamic shortcut
shortcutManager.disableShortcuts(List<String> shortcutIds);//disableShortcuts 置灰
shortcutManager.removeDynamicShortcuts(List<String> shortcutIds);//disableShortcuts 删除
shortcutManager.removeAllDynamicShortcuts();//disableShortcuts 删除全部
3.桌面图标
需要获取桌面权限:
<!-- 添加快捷方式 --> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<!-- 移除快捷方式 --> <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
跳转的类(ps:未标明是Intent.ACTION_MAIN和Intent.CATEGORY_LAUNCHER的类)AndroidManifest.xml配置中必须加android:exported="true"属性,不然跳转不过去。26版本以下可能进不去
一. 创建
if (26版本及以上) {
if (shortcutManager.isRequestPinShortcutSupported()) {
Intent shortcutInfoIntent = new Intent(context, "跳转类");
shortcutInfoIntent.setAction(Intent.ACTION_VIEW);
PendingIntent shortcutCallbackIntent = PendingIntent.getBroadcast(context, 0,
new Intent(context, "返回跳转类"),
PendingIntent.FLAG_UPDATE_CURRENT);
builder.setIcon(Icon.createWithResource(context, icon)); //设置图标
builder.setShortLabel(title); //设置短标题
builder.setIntent(shortcutInfoIntent);
shortcutManager.requestPinShortcut(builder.build(), shortcutCallbackIntent.getIntentSender());
}
} else {
Intent shortcut = new Intent(INSTALL_SHORTCUT_ACTION);
shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, name); //设置短标题
Parcelable value = Intent.ShortcutIconResource.fromContext(context, icon);//设置图标
shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON, value);
shortcut.putExtra("duplicate", false);
shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, value);
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(context, "跳转类"));
shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent));
context.sendBroadcast(shortcut);
}
二. 删除
if (26版本及以上) {
shortcutManager.removeDynamicShortcuts(List<String> shortcutIds);//disableShortcuts 删除
} else {
Intent intent = new Intent(UNINSTALL_SHORTCUT_ACTION);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);//设置短标题
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(context, "跳转类"));
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
context.sendBroadcast(intent);
}
完毕,若有问题请留言!