安卓通过app之间的跳转

我们都知道安卓开发中经常会从当前APP跳转到另一个APP。比如支付的时候你可能从一个团购网如:大众点评,付费时跳到另一个支付APP如:支付宝。我一般都是用包名跳转,前提是你要知道你要跳转APP的包名。

一.通过包名直接打开APP

第一种

   // 通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等
        PackageInfo packageinfo = null;
        String packagename = "com.seatrend.demo";
        try {
            packageinfo = getPackageManager().getPackageInfo(packagename, 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            Log.e("lcb", e + "  43");
        }
        if (packageinfo == null) {
            Log.e("lcb", "未安装此程序  46");
            return;
        }
        // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
        Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
        resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        resolveIntent.setPackage(packageinfo.packageName);
        // 通过getPackageManager()的queryIntentActivities方法遍历
        List<ResolveInfo> resolveinfoList = getPackageManager()
                .queryIntentActivities(resolveIntent, 0);
        ResolveInfo resolveinfo = resolveinfoList.iterator().next();
        if (resolveinfo != null) {
            // packagename = 参数packname
            String packageName = resolveinfo.activityInfo.packageName;
            // 这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packagename.mainActivityname]
            String className = resolveinfo.activityInfo.name;
            // LAUNCHER Intent
            startAPP(packageName, className, this);
        }
    public static void starAPP(String packagename, Context context) {
        // 这里的packname就是从上面得到的目标apk的包名
        Intent resolveIntent = context.getPackageManager().getLaunchIntentForPackage(packagename);
        // 启动目标应用
        context.startActivity(resolveIntent);
    }
    /*通过包名和类名打开APP*/
    public void startAPP(String packageName, String className) {
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        // 设置ComponentName参数1:packagename参数2:MainActivity路径
        ComponentName cn = new ComponentName(packageName, className);
        intent.setComponent(cn);
        intent.putExtra("keystr", "123456");
        //启动带回调的窗体,16是回调码
        startActivityForResult(intent, 16);
    }

 

第二种

       Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        // 设置ComponentName参数1:packagename参数2:MainActivity路径
        String packageName = "com.vkelinevideo";
        ComponentName cn = new ComponentName(packageName, packageName + ".activity.SetActivity");
        intent.setComponent(cn);
        intent.putExtra("cylsh", "VIN1234567895411");
        //启动带回调的窗体,16是回调码
        startActivityForResult(intent, 16);

 

 

	String packageName = "com.nanc.pda.vkelinevideo";
				Intent intent = new Intent("android.intent.action.VIEW");//
                //intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				intent.setComponent(new ComponentName(packageName, packageName + ".activity.MainActivity"));
				intent.putExtra("jylsh", szJylsh);
				intent.putExtra("jycs", jycs);
				intent.putExtra("hphm", szCarNum);
				intent.putExtra("hpzl",  hpzl);
				//启动带回调的窗体,16是回调码
				startActivityForResult(intent, 16);

上面是打开APP的第二种方式,和第一种不同的是,它会新开个栈。第一种它是覆盖原APP

 

二.进程间通讯

2.1A程序唤醒B程序

//查验终端调用三方测量软件的包名
String packageName = "com.tmri.size.app";
        Intent intent = new Intent("android.intent.action.VIEW");
        intent.setComponent(new ComponentName(packageName, packageName + ".RequestAction"));
        intent.putExtra("keystr", "123456");
       //启动带回调的窗体,16是回调码
        startActivityForResult(intent, 16);

2.2B程序接受数据

        Intent intent = getIntent();
        if (intent != null) {
            keystr = intent.getStringExtra("keystr");
            cylsh = intent.getStringExtra("cylsh");
            clsbdh = intent.getStringExtra("clsbdh");
            LogUtils.file("无锡所返回数据:" + keystr + "\n查验流水号:" + cylsh + "\n车辆识别代号:" + clsbdh);
        }

2.3B程序发送数据

        Intent n = new Intent();
        n.putExtra("code", "1");
        n.putExtra("message", "发送成功");
        n.putExtra("keystr", keystr);
        setResult(Activity.RESULT_OK, n);
        finish();

2.4A程序接收数据

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 16 && resultCode == Activity.RESULT_OK) {
            StringBuffer stringBuffer = new StringBuffer();
            stringBuffer.append("接收到的数据信息:\n")
                    .append("查验流水号:").append(data.getStringExtra("cylsh")).append(",")
                    .append("车辆识别代号:").append(data.getStringExtra("clsbdh")).append(",")
                    .append("keystr:").append(data.getStringExtra("keystr"))
                    tv.setText(stringBuffer);
        }
    }

 

三.解决applicationId和开发包名不一致

由于一些特殊的原因在项目初始创建是的包名和上架时applicationId不一致

跳转的方法这样写:

        String packageName = "com.kernal.passportreader.myapplication";// applicationId
        String cls="com.vkeline.pda.login.LoginActivity";//类名
        Intent intent = new Intent("android.intent.action.VIEW");
        intent.setComponent(new ComponentName(packageName, cls));
        intent.putExtra("keystr", "123456");
        startActivityForResult(intent, 16);

判断跳转的APP是否安装

if (getPackageManager().resolveActivity(intent, 0) == null) {
    // 说明系统中不存在这个activity
    Toast.makeText(TakePic_Activity.this,"未在手机中检测到视频插件",Toast.LENGTH_SHORT).show();
    return;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值