为其他包活动创建快捷方式的最佳方法

时间:2012-03-05 09:31:18

标签: java android android-activity android-intent shortcut

我正在尝试为任何已安装的应用程序创建可编程性的主页快捷方式。

考虑到我唯一可用的是应用程序名称,例如计算器com.android.calculator2(1.5)。

我正在使用当前代码,快捷方式已成功创建,但无法从快捷方式启动活动(我猜错了活动类名称),有时图标似乎已损坏。

同时将com.android.launcher.permission.INSTALL_SHORTCUT添加到manifest.xml

有没有最佳方法来实现这一目标?

String appName = "com.android.calculator2";
Context newAppContext = null;

// Get other package context
try {
    newAppContext =
        context.createPackageContext(appName, Context.CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
    e.printStackTrace();
}

// Create shortcut
if(newAppContext != null) {
    // Get Application Name
    PackageManager pm = context.getPackageManager();
    ApplicationInfo ai;

    try {
        ai = pm.getApplicationInfo(appName, 0);
    } catch (final NameNotFoundException e) {
        ai = null;
    }

    // Get application label
    String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : "(unknown)");

    // Shortcut intent
    Intent shortcutIntent  = new Intent (Intent.ACTION_MAIN);

    /** Problem in here **
    shortcutIntent.setClassName(newAppContext, newAppContext.getClass().getName());
    *********************/

    shortcutIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    // Create intent
    final Intent putShortCutIntent = new Intent();
    putShortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    putShortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, applicationName);
    putShortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, 
                               Intent.ShortcutIconResource.fromContext(newAppContext,
                                                                       R.drawable.icon));
    putShortCutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");

    // Broadcast intent
    context.sendBroadcast(putShortCutIntent);
}

修改

通过从PackageManager.getLaunchIntentForPackage(String packageName)获取Intent来实现此目的。

所以:

// Intent shortcutIntent  = new Intent (Intent.ACTION_MAIN);
// shortcutIntent.setClassName(newAppContext, newAppContext.getClass().getName());
// shortcutIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Intent shorcutIntent = pm.getLaunchIntentForPackage(appName);

1 个答案:

答案 0 :(得分:0)

当它无法在包中找到主要活动类时,您将获得“错误的活动类名称”。它需要该信息,以便它可以在正确的包中启动正确的Activity。所以在你的例子中,它应该是:

shortcutIntent.setClassName("com.android.calculator2", "ClassName");

我不知道"ClassName"对于Calculator应用程序应该是什么(也许你可以检查它的源代码),但它应该像"com.android.calculator2.MainActivity"

修改
好的,似乎可以动态获取"ClassName"

PackageManager packageManager = context.getPackageManager();
ResolveInfo info = packageManager.resolveActivity(shortcutIntent, 0);
if(info != null) {
    shortcutIntent.setClassName(info.activityInfo.packageName, info.activityInfo.name);
}