android 解决两个应用互相跳转,如果应用已经启动还是会重新打开应用的问题
2015-12-02 16:46
771 查看
有时候我们用getPackageManager().getLaunchIntentForPackage("com.xxx.xxx");方法来跳转到另外一个应用,但是发现每次跳转后该应用哪怕在后台已经是启动状态也会导致该应用重新启动,所以这里来解决这个问题
参考Android系统原生桌面程序的图标点击效果。主要在于正确设置Intent的相关属性。
可以参考桌面程序的点击效果,那就去参考一下桌面程序是怎么设置相关的参数的。
其中intent数据为从桌面程序中laucher.db数据库favorite表中intent字段所取得的数据。
以有道口语大师为例:
其中数据可以简单理解为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
参考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
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories