仅使用包名从另一个应用程序启动活动

时间:2011-10-27 10:58:53

标签: android

我想从我的Activity启动另一个应用程序Activity,但是我拥有的所有信息都只是该应用程序包的名称。我做了以下事情:

Intent intent = new Intent();
intent.setPackage(anotherApplicationPackageName);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);

据我所知,使用此API,Android会查找Activity,它可以处理给定包中的Intent,但我总是得到ActivityNotFoundException

问题是我做错了什么?

3 个答案:

答案 0 :(得分:8)

    PackageManager  pmi = getPackageManager();
    Intent intent = null;

intent = pmi.getLaunchIntentForPackage(packageNameToLaunch);                    
if (intent != null){
    startActivity(intent);
}

答案 1 :(得分:1)

您必须使用“Intent.CATEGORY_DEFAULT”类别声明另一个活动的intent过滤器并创建自定义操作并使用该类别和操作调用它,在intent中设置包只会缩小其范围。

答案 2 :(得分:0)

Intent.ACTION_SEND我遇到了类似的问题。可能这段代码对某人有用:

/** Knowing intent and package name, set the component name */
public static Intent setComponentByPackageName(Context context, String packageName, Intent intent0) {
    Intent intent = new Intent(intent0);
    if (null == intent.getType()) {
        intent.setType("text/plain");
    }
    PackageManager pm = context.getPackageManager();
    List<ResolveInfo> rList = pm.queryIntentActivities(intent, 0);
        // possible flags:
        // PackageManager.MATCH_DEFAULT_ONLY  PackageManager.GET_RESOLVED_FILTER
    for (ResolveInfo ri : rList) {
        if (packageName.equals(ri.activityInfo.packageName)) {
            intent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
            return intent;
        }
    }
    return null;
}

在尝试使其工作(ResolveInfo列表为空)的过程中,我发现缺少 setType()(您不需要 setType() setPackage()如果 setComponent()),那么实际上以下就足够了:

    intent.setAction(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.setPackage("com.xxxxxx");
    // ...
    intent.putExtra(Intent.EXTRA_TEXT, text);
    // ...
    startActivityForResult(intent, ...);