您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

启动第三方App

时间:02-07来源:作者:点击数:

方式一:

这种方式需要知道应用的包名(进程名)和应用的启动类(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是用于显示桌面图标的。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门