Loading... > 在应用开发的过程中,需要从当前应用跳转到其他APP的场景也是存在的。 #### 判断APP是否安装 在跳转第三方APP之前,我们必须判断第三方APP是否安装,一般来说有两种方式。 1. 可以通过获取某个应用信息的存在来判断是否安装 ```Kotlin 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 } ``` 2. 通过获取应用列表对比判断 ```Kotlin 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 ```Kotlin /** * 启动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信息,从而实现跳转。 2. 跳转应用的特定界面 ```Kotlin /** * 启动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. 直接应用市场下载 通过应用的包名在应用市场查询 ```Kotlin /** * 这里是进入应用商店,下载指定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) { } } ``` 2. 通过应用提供的直链下载(这里就不多加赘述了) #### 目标应用的处理 1. 隐式跳转需要给activity添加特定的action 2. 为了桌面的整洁,有些目标应用不需要显示桌面图标,可以对启动activity的category进行处理,一般来说,我们默认的启动activity的category是```android.intent.category.LAUNCHER```,具体如下 ```xml <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。 最后修改:2021 年 07 月 22 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏