方式一:
这种方式需要知道应用的包名(进程名)和应用的启动类(Activity)。
fun openApp(packageName: String, activityName: String) {
try {
startActivity(Intent(Intent.ACTION_MAIN).apply {
component = ComponentName(packageName, activityName)
flags = Intent.FLAG_ACTIVITY_NEW_TASK
})
} catch (e: ActivityNotFoundException) {
Toast.makeText(this, "App没有安装",Toast.LENGTH_SHORT).show()
}
}
注:Activity需要使用完整包名,假设应用包名为:a.b.c,Activity为MainActivity,调用如下:
openApp("a.b.c", "a.b.c.module.MainActivity")
方式二:
这种方式和方式一几乎是一样的,只不过是不用传启动类,它通过系统API来查找到应用的启动类(Activity),代码如:
fun openApp(packageName: String) {
val launcherActivityName = getLauncherActivityNameByPackageName(packageName)
if (launcherActivityName.isNullOrBlank()) {
val text = "无法启动应用:$packageName,因为获取不到该应用的启动类"
Toast.makeText(ContextHolder.getContext(), text, Toast.LENGTH_SHORT).show()
return
}
val intent = Intent(Intent.ACTION_MAIN).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
component = ComponentName(packageName, launcherActivityName)
}
ContextHolder.getContext().startActivity(intent)
}
private fun getLauncherActivityNameByPackageName(packageName: String): String? {
val resolveIntent = Intent(Intent.ACTION_MAIN).apply {
//addCategory(Intent.CATEGORY_LAUNCHER) // 无图标的启动类没有这个Category
setPackage(packageName)
}
val resolveInfoList: List<ResolveInfo> = ContextHolder.getContext().packageManager.queryIntentActivities(resolveIntent, 0)
val iterator = resolveInfoList.iterator()
return if (iterator.hasNext()) iterator.next().activityInfo?.name else null
}
如上代码,这种方式是通过指定的包名,通过系统API获取带有Action为MAIN的Activity,这种Activity的清单文件类似如下:
<activity
android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!--<category android:name="android.intent.category.LAUNCHER" />-->
</intent-filter>
</activity>
注:如果应用把category这一行注释的话,则这个App在桌面上是没有图标显示的,相应的,我们要获取这种Activity时,就代码中就不能调用addCategory(Intent.CATEGORY_LAUNCHER)这个函数了,如果添加了就获取不到了。
还有,如果一个应用设置了多个Activity都有android.intent.action.MAIN,根据我们的代码实现则只取第一个遍历到的Activity。所以,如果你确定你要打开的应用都是有桌面图标的,则最后添加上addCategory(Intent.CATEGORY_LAUNCHER)的调用,因为一般一个应用只有一个Activity是用于显示桌面图标的。