背景
我已经知道如何在全局范围内放置应用程序的快捷方式:
意图快捷方式Intent=new Intent(); shortcutIntent.setComponent(new ComponentName(packageName,fullPathToActivity));
final Intent putShortCutIntent=new Intent();
putShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,shortcutIntent);
//... <=preparing putShortcutIntent with some customizations (title, icon,...)
putShortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
context.sendBroadcast(putShortcutIntent);
这很好用。我希望做的是能够将快捷方式仅放置到特定的启动器应用程序(实际上它是默认的启动器应用程序,但这不是问题)。
问题
出于某种原因,我没有将快捷方式放在我选择的启动器应用程序上(在本例中为“nova 启动器”),而是仅在 touchwiz 启动器上创建了快捷方式。
我试过的
显而易见的解决方案是:
putShortcutIntent.setClassName(launcherPackageName,broadcastReceiverClassName);
或者
putShortcutIntent.setPackage(launcherPackageName);
没有工作,即使我在调试模式下看到值很好(参数是合法的)。
奇怪的是,如果我使用它,它只会将快捷方式放在 touchwiz 启动器上......
问题
为什么会发生?
为什么我不能选择将广播发送到哪里?
有没有更好的方法来实现这一目标?
编辑:这是我如何获得可以处理快捷方式创建意图的默认广播接收器:
final ResolveInfo defaultActivityForLauncherIntent=... //here i return the correct app that is the default launcher
Intent intentForAddingShortcutOnDesktop=new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
//<= here I prepare the intent of creating a shortcut
final List<ResolveInfo> broadcastReceiversResolveInfos=context.getPackageManager().queryBroadcastReceivers(intentForAddingShortcutOnDesktop,0);
for(final ResolveInfo resolveInfo : broadcastReceiversResolveInfos)
if(resolveInfo.activityInfo.packageName.equals(defaultActivityForLauncherIntent.activityInfo.packageName))
{
intentForAddingShortcutOnDesktop.setComponent(new ComponentName(//
resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name));
break;
}
context.sendBroadcast(intentForAddingShortcutOnDesktop);
混乱的一部分似乎是游戏商店被设置为创建新的快捷方式。
这,以及我忘记查询广播接收器而不是活动的事实......