我们都知道安卓开发中经常会从当前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; }