知道对方包和MainActivity的就很好办
我们在这种情况下直接包一个app的包名字符串和MainActivity字符串传进去就自动把另外一个应用启动起来了。
/**
*
* @param pkg
* 应用的包名
* @param cls
* 我要启动的类名,记住是pkg.类名的形式,必须是全限定名形式
* 例如openAppPakgAndMainActivity("com.example.caculator",
* "com.example.caculator.MainActivity");
*/
private void openAppPakgAndMainActivity(String pkg, String cls) {
Intent intent = new Intent(Intent.ACTION_MAIN, null);// 定义目标activity的action
intent.addCategory(Intent.CATEGORY_LAUNCHER);// 定义目标activity的category
intent.setComponent(new ComponentName(pkg, cls));
startActivity(intent);
}
只知道包名字符串情况下
在这种情况下我们需要根据包名获取他的MainActivity,然后在启动。具体代码逻辑如下
/**
* 通过应用的包字符串可以获得该应用的mainActivity,然后通过包名和mainActivity启动 另外一个应用
*
* @param packageName
* 另外一个应用的包字符串, 就是AndroidManifest.xml文件下manifest节点的package属性的值
*/
private void openAppFromPakg(String packageName) {
PackageInfo pi;
// 获取packagemanager实例
PackageManager pm = getPackageManager();
try {
// 通过包名获取androidmanife.xml的所有相关信息
pi = pm.getPackageInfo(packageName, 0);
//定义我要寻找的activity的intent
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(pi.packageName);
// 返回所有的与resolveIntent这个intent匹配的activity
List<ResolveInfo> apps = pm.queryIntentActivities(resolveIntent, 0);
//ResolveInfo实际是activity列表,并获取第一个activity
ResolveInfo ri = apps.iterator().next();
if (ri != null) {
String packagename = ri.activityInfo.packageName;
String className = ri.activityInfo.name;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packagename, className);
intent.setComponent(cn);
startActivity(intent);
}
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
android4.2亲测有效