在android应用中启动另一个非官方的应用

知道对方包和MainActivity的就很好办

我们在这种情况下直接包一个app的包名字符串和MainActivity字符串传进去就自动把另外一个应用启动起来了。

/**
     * 
     * @param pkg
     *            应用的包名
     * @param cls
     *            我要启动的类名,记住是pkg.类名的形式,必须是全限定名形式
     *            例如openAppPakgAndMainActivity("com.example.caculator",
     *            "com.example.caculator.MainActivity");
     */
    private void openAppPakgAndMainActivity(String pkg, String cls) {
        Intent intent = new Intent(Intent.ACTION_MAIN, null);// 定义目标activity的action
        intent.addCategory(Intent.CATEGORY_LAUNCHER);// 定义目标activity的category
        intent.setComponent(new ComponentName(pkg, cls));
        startActivity(intent);
    }

只知道包名字符串情况下

在这种情况下我们需要根据包名获取他的MainActivity,然后在启动。具体代码逻辑如下

/**
     * 通过应用的包字符串可以获得该应用的mainActivity,然后通过包名和mainActivity启动 另外一个应用
     * 
     * @param packageName
     *            另外一个应用的包字符串, 就是AndroidManifest.xml文件下manifest节点的package属性的值
     */
    private void openAppFromPakg(String packageName) {
        PackageInfo pi;
        // 获取packagemanager实例
        PackageManager pm = getPackageManager();
        try {
            // 通过包名获取androidmanife.xml的所有相关信息
            pi = pm.getPackageInfo(packageName, 0);
            //定义我要寻找的activity的intent
            Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
            resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            resolveIntent.setPackage(pi.packageName);

            // 返回所有的与resolveIntent这个intent匹配的activity
            List<ResolveInfo> apps = pm.queryIntentActivities(resolveIntent, 0);
            //ResolveInfo实际是activity列表,并获取第一个activity
            ResolveInfo ri = apps.iterator().next();
            if (ri != null) {

                String packagename = ri.activityInfo.packageName;
                String className = ri.activityInfo.name;

                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_LAUNCHER);

                ComponentName cn = new ComponentName(packagename, className);

                intent.setComponent(cn);
                startActivity(intent);
            }
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

android4.2亲测有效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值