android 解决两个应用互相跳转,如果应用已经启动还是会重新打开应用的问题

有时候我们用getPackageManager().getLaunchIntentForPackage("com.xxx.xxx");方法来跳转到另外一个应用,但是发现每次跳转后该应用哪怕在后台已经是启动状态也会导致该应用重新启动,所以这里来解决这个问题


参考Android系统原生桌面程序的图标点击效果。主要在于正确设置Intent的相关属性。

可以参考桌面程序的点击效果,那就去参考一下桌面程序是怎么设置相关的参数的。




其中intent数据为从桌面程序中laucher.db数据库favorite表中intent字段所取得的数据。
以有道口语大师为例:
#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.youdao.bigbang/.activity.LaunchActivity;end

其中数据可以简单理解为Intent序列化后的数据。也就是Intent需要设置为以上数据才能达到你希望的效果。
ACTION为android.intent.action.MAIN,category为android.intent.category.LAUNCHER,launchFlags为0x10200000,component可以简单理解为该应用的启动页activity。
launchFlags是用来表示应用页的启动属性,此处0x10200000表示属性为Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED。

最后上代码。

public static Intent getAppOpenIntentByPackageName(Context context, String packageName) {
		// MainActivity完整名
		String mainAct = null;
		// 根据包名寻找MainActivity
		PackageManager pkgMag = context.getPackageManager();
		Intent intent = new Intent(Intent.ACTION_MAIN);
		intent.addCategory(Intent.CATEGORY_LAUNCHER);
		intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);

		List<ResolveInfo> list = pkgMag.queryIntentActivities(intent, PackageManager.GET_ACTIVITIES);
		for (int i = 0; i < list.size(); i++) {
			ResolveInfo info = list.get(i);
			if (info.activityInfo.packageName.equals(packageName)) {
				mainAct = info.activityInfo.name;
				break;
			}
		}
		if (TextUtils.isEmpty(mainAct)) {
			return null;
		}
		intent.setComponent(new ComponentName(packageName, mainAct));
		return intent;
	}

	public static Context getPackageContext(Context context, String packageName) {
		Context pkgContext = null;
		if (context.getPackageName().equals(packageName)) {
			pkgContext = context;
		} else {
			// 创建第三方应用的上下文环境
			try {
				pkgContext = context.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY
						| Context.CONTEXT_INCLUDE_CODE);
			} catch (NameNotFoundException e) {
				e.printStackTrace();
			}
		}
		return pkgContext;
	}

	public static boolean openPackage(Context context, String packageName) {
		Context pkgContext = getPackageContext(context, packageName);
		Intent intent = getAppOpenIntentByPackageName(context, packageName);
		if (pkgContext != null && intent != null) {
			pkgContext.startActivity(intent);
			return true;
		}
		return false;
	}



直接调用openPackage()方法即可,返回false说明用户没有安装该应用





参考:http://www.zhihu.com/question/30153342/answer/47080956


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值