您的位置:首页 > 移动开发 > Android开发

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

2015-12-02 16:46 771 查看
有时候我们用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息