最近在做Launcher,需要使用类似Google Android Lancher2的启动App的方式。详细的说,就是启动一个App,如果目标App已经启动过,那么加载它的任务栈最上的一个Activity,而不是启动目标App的Launch Activity。
这里借鉴了别人的一些代码,在此感谢他们。
/**
* 通过包名启动App
* @param context
* @param packagename
*/
private static void doStartApplicationWithPackageName(Context context, String packagename) {
PackageInfo packageinfo = null;
try {
packageinfo = context.getPackageManager().getPackageInfo(packagename, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (null == packageinfo) {
return;
}
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(packageinfo.packageName);
// 通过PackageManager遍历目标package的所有Activity 配置数据
List<ResolveInfo> resolveinfoList = context.getPackageManager().queryIntentActivities(resolveIntent, 0);
// 获取目标Activity的数据
ResolveInfo resolveinfo = resolveinfoList.iterator().next();
if (resolveinfo != null) {
// packagename = 参数packname
String packageName = resolveinfo.activityInfo.packageName;
String className = resolveinfo.activityInfo.name;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
context.startActivity(intent);
}
}
代码写成一个静态方法,可以直接使用。