1

背景

我已经知道如何在全局范围内放置应用程序的快捷方式:

意图快捷方式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); 

混乱的一部分似乎是游戏商店被设置为创建新的快捷方式。

这,以及我忘记查询广播接收器而不是活动的事实......

4

0 回答 0