在应用开发的过程中,需要从当前应用跳转到其他 APP 的场景也是存在的。
# 判断 APP 是否安装
在跳转第三方 APP 之前,我们必须判断第三方 APP 是否安装,一般来说有两种方式。
- 可以通过获取某个应用信息的存在来判断是否安装
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
}
- 通过获取应用列表对比判断
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
}
# 跳转
- 跳转启动 APP
/**
* 启动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 信息,从而实现跳转。
- 跳转应用的特定界面
/**
* 启动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 下载
- 直接应用市场下载
通过应用的包名在应用市场查询
/**
* 这里是进入应用商店,下载指定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) {
}
}
- 通过应用提供的直链下载(这里就不多加赘述了)
# 目标应用的处理
- 隐式跳转需要给 activity 添加特定的 action
- 为了桌面的整洁,有些目标应用不需要显示桌面图标,可以对启动 activity 的 category 进行处理,一般来说,我们默认的启动 activity 的 category 是
android.intent.category.LAUNCHER, 具体如下
<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。