2025年3月17日 星期一 甲辰(龙)年 月十六 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

启动第三方App

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

方式一:

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

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