Better

业精于勤荒于嬉

ShortCuts

Better's Avatar 2017-02-15 Android

  1. 1. 1.Static Shortcut
    1. 1.1. 1.1在xml目录下新建一个Shortcuts文件
    2. 1.2. 1.2找启动页面
    3. 1.3. 1.3添加Shortcut
  2. 2. 2.Dynamic Shortcut
  3. 3. 3.Pinned Shortcut
  4. 4. Thanks

ShortCut是Android7.1推出的一个新功能,一般点击app的图标会打开一个app,这个新功能是你长按app图标的时候,弹出一个快捷的操作的选择框,以快速使用app的功能(不是其他的app)。

1.Static Shortcut

像在xml里面注册广播一样,在manfiest中注册Shortcuts。

1.1在xml目录下新建一个Shortcuts文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:enabled="true"
android:shortcutDisabledMessage="@string/short_setting_label_disabled"
android:shortcutId="com.main"
android:shortcutLongLabel="@string/short_setting_label_long"
android:shortcutShortLabel="@string/short_setting_label">
android:icon="@drawable/compose_icon"
<intent
android:action="android.intent.action.VIEW"
android:targetClass="better.shortcut.SettingActivity"
android:targetPackage="better.shortcut">
</intent>
<categories
android:name="android.shortcut.conversation">
</categories>
</shortcut>
<!--在label直接输入文字是编译不过的-->
</shortcuts>

shortcutId:唯一的id
shortcutLongLabel:长描述,优先显示
shortcutShortLabel:短描述
shortcutDisabledMessage:shortcut不可用时展示的文字
icon:图标
enabled:设置是否可用

1.2找启动页面

找到在被android.intent.action.MAIN和android.intent.category.LAUNCHER所标记Activity,也就是启动页面。

1.3添加Shortcut

1
2
3
4
5
6
7
8
9
10
11
12
13
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<application>
<activity android:name="Main">
<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>
</application>
</manifest>

2.Dynamic Shortcut

在代码中动态注册Shortcuts。主要是通过ShortManager来实现。

  1. 新增。setDynamicShortcuts和addDynamicShortcuts()
  2. 更新。updateShortcuts()
  3. 删除。 removeDynamicShortcuts()和removeAllDynamicShortcuts()。
1
2
3
4
5
6
7
8
9
10
11
12
Intent intent = new Intent(this, MainActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra(EXTRA_01, "test01的数据");

ShortcutInfo info = new ShortcutInfo.Builder(this, "com.test.01")
.setShortLabel("test01")
.setLongLabel("test01点击")
.setDisabledMessage("test01不能用")
.setIntent(intent)
.build();
list.add(info);
manager.addDynamicShortcuts(list);

通常在添加之前要判断一下当前应用支持几个Shortcut。
getMaxShortcutCountPerActivity()然后在添加。
注意targetSdkVersion 不能小于25。

3.Pinned Shortcut

在API 26 之前加上权限com.android.launcher.permission.INSTALL_SHORTCUT后可以这样创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void createShortcutBeforeO(String iconText, Object icon, boolean duplicate,Intent iExtraIntent) {
Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, iconText);
if (icon instanceof Integer) {
shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(mContext, (int) icon));
} else if (icon instanceof Bitmap) {
shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON, (Bitmap) icon);
}
shortcut.putExtra("duplicate", duplicate);
if (iExtraIntent != null) {
shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,iExtraIntent);
}
mContext.sendBroadcast(shortcut);
}

INSTALL_SHORTCUTUNINSTALL_SHORTCUT从26起就不支持了

In Android O (API level 26) and higher, the INSTALL_SHORTCUT broadcast no longer has any effect on your app because it’s a private, implicit broadcast.Instead, you should create an app shortcut by using the requestPinShortcut() method from the ShortcutManager class

需要使用ShortcutManager来创建快捷键,官方最佳实践App Shortcuts。创建桌面的Widget也是要用新的方式来创建Build an App Widget

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@TargetApi(Build.VERSION_CODES.O)
private void createShortcutAfterO(String iconText, Object icon, Intent iExtraIntent) {
if (null == iExtraIntent) {
return;
}
ShortcutManager manager = (ShortcutManager) LudashiApplication.getInstance().getSystemService(Context.SHORTCUT_SERVICE);
if (!manager.isRequestPinShortcutSupported()) {
return;
}
if (TextUtils.isEmpty(iExtraIntent.getAction())) {
iExtraIntent.setAction(Intent.ACTION_VIEW);
}
ShortcutInfo.Builder builder = new ShortcutInfo.Builder(LudashiApplication.getInstance(), iconText)
.setShortLabel(iconText)
.setIntent(iExtraIntent);
if (icon instanceof Integer) {
builder.setIcon(Icon.createWithResource(LudashiApplication.getInstance(), (int) icon));
} else if (icon instanceof Bitmap) {
builder.setIcon(Icon.createWithBitmap((Bitmap) icon));
}
ShortcutInfo info = builder.build();
PendingIntent shortcutCallbackIntent = PendingIntent.getBroadcast(LudashiApplication.getInstance(), 0,
new Intent(LudashiApplication.getInstance(), ShortcutInOReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);
manager.requestPinShortcut(info, shortcutCallbackIntent.getIntentSender());
}

注意:

  • 官方例子android-AppShortcuts动态添加网址快捷键,动态创建快捷键addDynamicShortcuts(List)的不一定会成功,在我的华为AUM-AL20上手机上不行,后来发现别个是创建Dynamic快捷键的。
  • requestPinShortcut()系统的授权界面会有延时,Oppo R15。
  • ShortcutManager.createShortcutResultIntent()也是可以用来创建PendingIntent的intent参数,这个方法文档上说用来自定义UI的。

Thanks

code

This article was last updated on days ago, and the information described in the article may have changed.