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

判断APP是否安装

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

  1. 可以通过获取某个应用信息的存在来判断是否安装
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. 通过获取应用列表对比判断
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
/**
     * 启动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. 跳转应用的特定界面
/**
     * 启动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. 直接应用市场下载
    通过应用的包名在应用市场查询
/**
     * 这里是进入应用商店,下载指定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,具体如下
<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 日 09 : 32 AM
如果觉得我的文章对你有用,请随意赞赏