当前APP跳转第三方应用

  • ~3.66K 字

在应用开发的过程中,需要从当前应用跳转到其他APP的场景也是存在的。

判断APP是否安装

在跳转第三方APP之前,我们必须判断第三方APP是否安装,一般来说有两种方式。

  1. 可以通过获取某个应用信息的存在来判断是否安装
1
2
3
4
5
6
7
8
9
10
fun isAppInstalled(context: Context, packageName: String): Boolean {
val packageManager = context.packageManager
var isInstalled = false
try {
val pInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_GIDS)
isInstalled = pInfo != null
} catch (e: Exception) {
}
return isInstalled
}
  1. 通过获取应用列表对比判断
1
2
3
4
5
6
7
8
9
10
11
12
fun isAppInstalled2(context: Context, packageName: String): Boolean {
val packageManager = context.packageManager
// 获取所有已安装程序的包信息
val pInfo = packageManager.getInstalledPackages(0)
for (i in pInfo.indices) {
// 循环判断是否存在指定包名
if (pInfo[i].packageName.equals(packageName, ignoreCase = true)) {
return true
}
}
return false
}

跳转

  1. 跳转启动APP
1
2
3
4
5
6
7
8
9
10
11
12
/**
* 启动App
* @param context
*/
fun launchApp(context: Context, packageName: String) {
// 判断是否安装过App,否则去市场下载
if (isAppInstalled(context, packageName)) {
context.startActivity(context.packageManager.getLaunchIntentForPackage(packageName))
} else {
InsAlertDialog.confirm(context, "消息", "是否下载该组件?下载过程中会连接网络,请确保在wifi下进行。", { dialog, which -> goToDownloadApp(context, packageName) }) { dialog, which -> }
}
}

通过context.packageManager.getLaunchIntentForPackage(packageName)方法获取跳转应用的launcherActivity的intent信息,从而实现跳转。

  1. 跳转应用的特定界面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 启动App特定界面
* @param context
*/
fun launchApp(context: Context, packageName: String, activityName: String, destAction: String) {
// 判断是否安装过App,否则去市场下载
if (isAppInstalled(context, packageName)) {
val intent = Intent()
intent.component = ComponentName(packageName, activityName)
intent.action = destAction
context.startActivity(intent)
} else {
InsAlertDialog.confirm(context, "消息", "是否下载该组件?下载过程中会连接网络,请确保在wifi下进行。", { _, _ -> goToDownloadApp(context, packageName) }) { _, _ -> }
}
}

通过指定对应APP中的具体Activity的全类名显式跳转,或者使用action隐式跳转都可以达到我们的目的。

APP下载

  1. 直接应用市场下载
    通过应用的包名在应用市场查询
1
2
3
4
5
6
7
8
9
10
11
/**
* 这里是进入应用商店,下载指定APP的方法。
*/
private fun goToMarket(context: Context, packageName: String) {
val uri: Uri = Uri.parse("market://details?id=$packageName")
val goToMarket = Intent(Intent.ACTION_VIEW, uri)
try {
context.startActivity(goToMarket)
} catch (e: java.lang.Exception) {
}
}
  1. 通过应用提供的直链下载(这里就不多加赘述了)

目标应用的处理

  1. 隐式跳转需要给activity添加特定的action
  2. 为了桌面的整洁,有些目标应用不需要显示桌面图标,可以对启动activity的category进行处理,一般来说,我们默认的启动activity的category是android.intent.category.LAUNCHER,具体如下
1
2
3
4
5
6
7
<activity android:name=".app.launcher.LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

去除 <category android:name="android.intent.category.LAUNCHER" />这一行的显示就能使桌面图标不显示了,注意:Android Studio直接Run的话会报错,因为找不到启动的category,但是不影响打包安装。同理,我们在使用默认方法跳转的时候,这种情况下getLaunchIntentForPackage(packageName)方法会返回null,因此在使用已隐藏图标的APP作为目标应用时,不能使用这种方法获取跳转的intent。

赞助喵
非常感谢您的喜欢!
赞助喵
分享这一刻
让朋友们也来瞅瞅!