如何使用 ShortcutManager API 为 android 7.1 应用程序创建动态应用程序快捷方式?
How to create dynamic app shortcut using ShortcutManager API for android 7.1 app?
在 Android 7.1 中,开发者可以创建 AppShortCut.
我们可以通过两种方式创建快捷方式:
- 使用资源 (XML) 文件的静态快捷方式。
- 使用
ShortcutManager
API 的动态快捷方式。
那么如何使用 ShortcutManager
动态创建快捷方式?
使用ShortcutManager
,我们可以通过以下方式创建应用程序动态应用程序快捷方式:
ShortcutManager shortcutManager;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo shortcut;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) {
shortcut = new ShortcutInfo.Builder(this, "second_shortcut")
.setShortLabel(getString(R.string.str_shortcut_two))
.setLongLabel(getString(R.string.str_shortcut_two_desc))
.setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
.setIntent(new Intent(Intent.ACTION_VIEW,
Uri.parse("https://www.google.co.in")))
.build();
shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));
}
}
字符串资源:
<string name="str_shortcut_two">Shortcut 2</string>
<string name="str_shortcut_two_desc">Shortcut using code</string>
开发者还可以使用 ShortcutManager
:
执行不同的应用程序快捷方式
- 发布:使用setDynamicShortcuts(List) to redefine the entire list of dynamic shortcuts, or use addDynamicShortcuts(List)扩充现有的动态快捷方式列表。
- 更新:使用updateShortcuts(List)方法。
- 删除:使用removeDynamicShortcuts(List), or remove all dynamic shortcuts using removeAllDynamicShortcuts()删除一组动态快捷方式。
检查 Github 示例 App Shortcut
检查 https://developer.android.com/preview/shortcuts.html and ShortcutManager 以获取更多信息。
我们可以将 ShortcutManager 用于这样的意图操作
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo webShortcut = new ShortcutInfo.Builder(this, "shortcut_web")
.setShortLabel("catinean.com")
.setLongLabel("Open catinean.com web site")
.setIcon(Icon.createWithResource(this, R.drawable.ic_dynamic_shortcut))
.setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://catinean.com")))
.build();
shortcutManager.setDynamicShortcuts(Collections.singletonList(webShortcut));
我们可以像这样使用 ShortcutManager 打开一个 activity
ShortcutInfo dynamicShortcut = new ShortcutInfo.Builder(this, "shortcut_dynamic")
.setShortLabel("Dynamic")
.setLongLabel("Open dynamic shortcut")
.setIcon(Icon.createWithResource(this, R.drawable.ic_dynamic_shortcut_2))
.setIntents(
new Intent[]{
new Intent(Intent.ACTION_MAIN, Uri.EMPTY, this, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),
})
.build();
shortcutManager.setDynamicShortcuts(Arrays.asList(dynamicShortcut, dynamicShortcut));
适用于所有设备(Pre/Post Oreo 设备)的完美解决方案。
createShortcut(CurrentActivity.this, ActivityToOpen.class, "app name", R.mipmap.ic_launcher);
将其放入您的 Util。
public static void createShortcut(@NonNull Activity activity, Class activityToOpen, String title, @DrawableRes int icon) {
Intent shortcutIntent = new Intent(activity, activityToOpen);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { // code for adding shortcut on pre oreo device
Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
intent.putExtra("duplicate", false);
Parcelable parcelable = Intent.ShortcutIconResource.fromContext(activity, icon);
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, parcelable);
activity.sendBroadcast(intent);
System.out.println("added_to_homescreen");
} else {
ShortcutManager shortcutManager = activity.getSystemService(ShortcutManager.class);
assert shortcutManager != null;
if (shortcutManager.isRequestPinShortcutSupported()) {
ShortcutInfo pinShortcutInfo =
new ShortcutInfo.Builder(activity, "browser-shortcut-")
.setIntent(shortcutIntent)
.setIcon(Icon.createWithResource(activity, icon))
.setShortLabel(title)
.build();
shortcutManager.requestPinShortcut(pinShortcutInfo, null);
System.out.println("added_to_homescreen");
} else {
System.out.println("failed_to_add");
}
}
}
我们应该将快捷意图设置为目标 Activity 而不是提及隐式意图。
例如:
ShortcutManager shortcutManager = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) {
shortcutManager = getSystemService(ShortcutManager.class);
Intent intent= new Intent(this, MainActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("weburl"));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "shortcutId")
.setShortLabel("dummy")
.setLongLabel("dummy").setRank(0)
.setIcon(Icon.createWithResource(this, R.drawable.ic_launcher_background))
.setIntent(intent).build();
shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));
}
而我的 Manifest.xml 中的 Activity 是:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
通过单击处理 Action_VIEW 的动态快捷方式登陆到我的 MainActivity。
动态快捷键:
ShortcutManager 用于管理所有动态快捷方式。 ShortcutInfo 表示单个快捷方式,然后将通过 ShortcutInfo.Builder.
添加到 ShortcutManager
//......................................* Java Dynamic Shortcuts
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
Intent thirdIntent = new Intent(this,ThirdActivity.class);
thirdIntent.setAction(Intent.ACTION_VIEW);
ShortcutInfo thirdScreenShortcut = new ShortcutInfo.Builder(this, "shortcut_third")
.setShortLabel("Third Activity")
.setLongLabel("This is long description for Third Activity")
.setIcon(Icon.createWithResource(this, R.drawable.your_image))
.setIntent(thirdIntent)
.build();
shortcutManager.setDynamicShortcuts(Collections.singletonList(thirdScreenShortcut));
//......................................* KOTLIN Dynamic Shortcuts
val shortcutManager = getSystemService(ShortcutManager::class.java)
val thirdIntent = Intent(this, ActivityThree::class.java)
thirdIntent.action = Intent.ACTION_VIEW
val dynamicShortcut = ShortcutInfo.Builder(this, "shortcut_third")
.setShortLabel("Third Activity")
.setLongLabel("This is long description for Third Activity")
.setIcon(Icon.createWithResource(this, R.drawable.your_image))
.setIntents(
arrayOf(
Intent(
Intent.ACTION_MAIN,
Uri.EMPTY,
this,
MainActivity::class.java
).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),
thirdIntent
)
)
.build()
shortcutManager!!.dynamicShortcuts = listOf(dynamicShortcut)
要点:
https://androidkeynotes.blogspot.com/2020/02/app-shortcuts.html
在 Android 7.1 中,开发者可以创建 AppShortCut.
我们可以通过两种方式创建快捷方式:
- 使用资源 (XML) 文件的静态快捷方式。
- 使用
ShortcutManager
API 的动态快捷方式。
那么如何使用 ShortcutManager
动态创建快捷方式?
使用ShortcutManager
,我们可以通过以下方式创建应用程序动态应用程序快捷方式:
ShortcutManager shortcutManager;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo shortcut;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) {
shortcut = new ShortcutInfo.Builder(this, "second_shortcut")
.setShortLabel(getString(R.string.str_shortcut_two))
.setLongLabel(getString(R.string.str_shortcut_two_desc))
.setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
.setIntent(new Intent(Intent.ACTION_VIEW,
Uri.parse("https://www.google.co.in")))
.build();
shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));
}
}
字符串资源:
<string name="str_shortcut_two">Shortcut 2</string>
<string name="str_shortcut_two_desc">Shortcut using code</string>
开发者还可以使用 ShortcutManager
:
- 发布:使用setDynamicShortcuts(List) to redefine the entire list of dynamic shortcuts, or use addDynamicShortcuts(List)扩充现有的动态快捷方式列表。
- 更新:使用updateShortcuts(List)方法。
- 删除:使用removeDynamicShortcuts(List), or remove all dynamic shortcuts using removeAllDynamicShortcuts()删除一组动态快捷方式。
检查 Github 示例 App Shortcut
检查 https://developer.android.com/preview/shortcuts.html and ShortcutManager 以获取更多信息。
我们可以将 ShortcutManager 用于这样的意图操作
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo webShortcut = new ShortcutInfo.Builder(this, "shortcut_web")
.setShortLabel("catinean.com")
.setLongLabel("Open catinean.com web site")
.setIcon(Icon.createWithResource(this, R.drawable.ic_dynamic_shortcut))
.setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://catinean.com")))
.build();
shortcutManager.setDynamicShortcuts(Collections.singletonList(webShortcut));
我们可以像这样使用 ShortcutManager 打开一个 activity
ShortcutInfo dynamicShortcut = new ShortcutInfo.Builder(this, "shortcut_dynamic")
.setShortLabel("Dynamic")
.setLongLabel("Open dynamic shortcut")
.setIcon(Icon.createWithResource(this, R.drawable.ic_dynamic_shortcut_2))
.setIntents(
new Intent[]{
new Intent(Intent.ACTION_MAIN, Uri.EMPTY, this, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),
})
.build();
shortcutManager.setDynamicShortcuts(Arrays.asList(dynamicShortcut, dynamicShortcut));
适用于所有设备(Pre/Post Oreo 设备)的完美解决方案。
createShortcut(CurrentActivity.this, ActivityToOpen.class, "app name", R.mipmap.ic_launcher);
将其放入您的 Util。
public static void createShortcut(@NonNull Activity activity, Class activityToOpen, String title, @DrawableRes int icon) {
Intent shortcutIntent = new Intent(activity, activityToOpen);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { // code for adding shortcut on pre oreo device
Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
intent.putExtra("duplicate", false);
Parcelable parcelable = Intent.ShortcutIconResource.fromContext(activity, icon);
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, parcelable);
activity.sendBroadcast(intent);
System.out.println("added_to_homescreen");
} else {
ShortcutManager shortcutManager = activity.getSystemService(ShortcutManager.class);
assert shortcutManager != null;
if (shortcutManager.isRequestPinShortcutSupported()) {
ShortcutInfo pinShortcutInfo =
new ShortcutInfo.Builder(activity, "browser-shortcut-")
.setIntent(shortcutIntent)
.setIcon(Icon.createWithResource(activity, icon))
.setShortLabel(title)
.build();
shortcutManager.requestPinShortcut(pinShortcutInfo, null);
System.out.println("added_to_homescreen");
} else {
System.out.println("failed_to_add");
}
}
}
我们应该将快捷意图设置为目标 Activity 而不是提及隐式意图。
例如:
ShortcutManager shortcutManager = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) {
shortcutManager = getSystemService(ShortcutManager.class);
Intent intent= new Intent(this, MainActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("weburl"));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "shortcutId")
.setShortLabel("dummy")
.setLongLabel("dummy").setRank(0)
.setIcon(Icon.createWithResource(this, R.drawable.ic_launcher_background))
.setIntent(intent).build();
shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));
}
而我的 Manifest.xml 中的 Activity 是:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
通过单击处理 Action_VIEW 的动态快捷方式登陆到我的 MainActivity。
动态快捷键: ShortcutManager 用于管理所有动态快捷方式。 ShortcutInfo 表示单个快捷方式,然后将通过 ShortcutInfo.Builder.
添加到 ShortcutManager //......................................* Java Dynamic Shortcuts
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
Intent thirdIntent = new Intent(this,ThirdActivity.class);
thirdIntent.setAction(Intent.ACTION_VIEW);
ShortcutInfo thirdScreenShortcut = new ShortcutInfo.Builder(this, "shortcut_third")
.setShortLabel("Third Activity")
.setLongLabel("This is long description for Third Activity")
.setIcon(Icon.createWithResource(this, R.drawable.your_image))
.setIntent(thirdIntent)
.build();
shortcutManager.setDynamicShortcuts(Collections.singletonList(thirdScreenShortcut));
//......................................* KOTLIN Dynamic Shortcuts
val shortcutManager = getSystemService(ShortcutManager::class.java)
val thirdIntent = Intent(this, ActivityThree::class.java)
thirdIntent.action = Intent.ACTION_VIEW
val dynamicShortcut = ShortcutInfo.Builder(this, "shortcut_third")
.setShortLabel("Third Activity")
.setLongLabel("This is long description for Third Activity")
.setIcon(Icon.createWithResource(this, R.drawable.your_image))
.setIntents(
arrayOf(
Intent(
Intent.ACTION_MAIN,
Uri.EMPTY,
this,
MainActivity::class.java
).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),
thirdIntent
)
)
.build()
shortcutManager!!.dynamicShortcuts = listOf(dynamicShortcut)
要点: https://androidkeynotes.blogspot.com/2020/02/app-shortcuts.html