我遇到麻烦,动态创建的shurtcut不像原来的应用程序快捷方式/图标。原始app-launcher快捷方式被定义为具有launchmode = default,这使得应用程序只有一个实例。如果用户单击原始图标,则应用程序将正常打开,如果用户再次尝试单击启动器图标,则不会在新实例中启动应用程序,但会将第一个实例置于最前面。
问题是我在动态创建快捷方式时无法重新创建此行为。每次单击启动器图标时,创建的快捷方式都会创建应用程序的新实例。这不是预期的,因为它可能导致同时打开同一屏幕的多个实例。
任何人都知道如何创建快捷方式将已经打开的应用程序实例放在前面,而不是总是创建一个新实例?
如果我运行installShortcut("green");
实际上在主屏幕上创建了一个新的快捷方式,但它根本无法正常工作。
private void installShortcut(String color) {
Logcat.d(color);
if (Pref.getShortcutInstalled(this) != null) {
uninstallShortcut();
}
Parcelable icon = getIcon(color);
Intent install = createInstallIntent(icon);
getApplicationContext().sendBroadcast(install);
String str = getString(R.string.installed_shortcut);
String msg = str.replace("%var1", getString(R.string.app_name));
Toaster.toast(this, msg);
Pref.setShortcutInstalled(this, color);
Api.count(this, "install_shortcut|install_shortcut_" + color);
}
private void uninstallShortcut() {
Intent uninstall = createUnInstallIntent();
getApplicationContext().sendBroadcast(uninstall);
}
private Intent createUnInstallIntent() {
Intent intent = new Intent();
intent.setAction("com.android.launcher.action.UNINSTALL_SHORTCUT");
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, createMainIntent());
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
return intent;
}
private Parcelable getIcon(String color) {
Parcelable icon = getIconParcelable(R.mipmap.ic_launcher);
if ("blue".equals(color)) {
icon = getIconParcelable(R.drawable.ic_launcher_blue);
} else if ("purple".equals(color)) {
icon = getIconParcelable(R.drawable.ic_launcher_purple);
} else if ("green".equals(color)) {
icon = getIconParcelable(R.drawable.ic_launcher_green);
} else if ("orange".equals(color)) {
icon = getIconParcelable(R.drawable.ic_launcher_orange);
}
return icon;
}
private Parcelable getIconParcelable(int resourceId) {
return Intent.ShortcutIconResource.fromContext(this, resourceId);
}
private Intent createInstallIntent(Parcelable icon) {
Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, createMainIntent());
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
intent.putExtra("duplicate", true);
return intent;
}
private Intent createMainIntent() {
Intent intent = new Intent(this, MainActivity.class);
intent.setAction(Intent.ACTION_MAIN);
return intent;
}
更新:
在更多设备上找到更好的替代方式。
public void addShortcut(Context context, String color) {
//deleteShortcut(this);
Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
ApplicationInfo appInfo = context.getApplicationInfo();
shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, context.getString(R.string.app_name));
shortcut.putExtra("duplicate", false); // Just create once
ComponentName component = new ComponentName(appInfo.packageName, appInfo.packageName+".activity.MainActivity");
shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(component));
int res = getIconRes(color);
Intent.ShortcutIconResource iconResource = Intent.ShortcutIconResource.fromContext(context, res);
shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
context.sendBroadcast(shortcut);
}
private int getIconRes(String color) {
int res = R.mipmap.ic_launcher;
if ("blue".equals(color)) {
res = R.drawable.ic_launcher_blue;
} else if ("purple".equals(color)) {
res = R.drawable.ic_launcher_purple;
} else if ("green".equals(color)) {
res = R.drawable.ic_launcher_green;
} else if ("orange".equals(color)) {
res = R.drawable.ic_launcher_orange;
}
return res;
}