在应用开发的过程中,需要从当前应用跳转到其他APP的场景也是存在的。
判断APP是否安装
在跳转第三方APP之前,我们必须判断第三方APP是否安装,一般来说有两种方式。
- 可以通过获取某个应用信息的存在来判断是否安装
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 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 }
|
跳转
- 跳转启动APP
1 2 3 4 5 6 7 8 9 10 11 12
|
fun launchApp(context: Context, packageName: String) { 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
fun launchApp(context: Context, packageName: String, activityName: String, destAction: String) { 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 2 3 4 5 6 7 8 9 10 11
|
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,具体如下
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。