很多时候,我们会想打开第三方应用,比如广告中判断应用是否安装,如果安装就跳转该应用首页,未安装则去应用商店该应用详情页。
那么接下来就讲讲几种打开第三方应用首页的方案。
通过包名跳转
知道包名跳转有以下三种
a.通过packageManager.getLaunchIntentForPackage(packageName: String)
代码如下
fun startAppWithPackageName(context: Context, packageName: String) { //根据包名获取启动首页的intent 这个intent有可能为空 val intent = context.packageManager.getLaunchIntentForPackage(packageName) if (intent != null) { intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) context.startActivity(intent) } }
看方法名就可以知道 这里的intent是通过PackageManager去获取该包名里面category为Launch的类,那么如果一个应用中没有定义这样的类,自然获取的intent就是空
讲到这里,扩展一下:
如果一个应用中的清单文件里所有activity都没有
那么在手机桌面上该应用图标就会被隐藏,当然在主activity还是得设置以下的
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" />intent-filter>
b.还知道该应用中activite的具体类名
fun startAppWithPackageName(context: Context, packageName: String, activityName: String) {//activityName 举例:com.google.app.MainActivityval intent = Intent().apply { component = ComponentName(packageName, activityName) flags = Intent.FLAG_ACTIVITY_NEW_TASK } context.startActivity(intent)}
c.通过Uri中是scheme进行跳转
在知道第三方应用的包名与scheme时,可以通过以下方案打开该应用
代码如下:
val intent = Intent().apply { data = Uri.parse("scheme://authorty?query") setPackage(packageName) setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } context.startActivity(intent)
这里要注意的点:
scheme 一定要是第三方应用中声明过的,如果多个三方应用设置了相同的scheme,要想跳转到指定应用这一定要设置setPackage(packageName)
扩展一下
细心一点,都会发现上面的三种启动方式,我都设置了setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
那么关于这个的flag的作用是什么呢?
其实这个flag我们更常用在activity的跳转中,表示如果栈中存在该类,则直接在该栈中启动该类,否则就新建一个栈来启动该类。
那么这个flag在启动应用时也是相同的作用:将整个Android系统看成一个app,里面不同app既不同的activity,有些不太一样的点在于,如果该app已经启动了,使用该flag只会唤起该app,如果没有启动该app,那么就会启动该app。
那如果我们启动一个app会传递很多参数过去,一般app获取这些参数都会在启动页去接收并处理,那我们使用上面的FLAG_ACTIVITY_NEW_TASK,在应用存活时只会唤起app而不会走启动页,那我们又该如何让应用重新启动呢?
Intent.FLAG_ACTIVITY_CLEAR_TASK就起到作用了,我们在启动时设置以下即可重新启动该应用
setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
注意:Intent.FLAG_ACTIVITY_CLEAR_TASK 只有和Intent.FLAG_ACTIVITY_NEW_TASK同时设置才有效。
但有些应用可能会在启动页进行拦截这种重新启动的事件,所以还得再设置以下action,而这就要看第三方应用的处理方案了。
拦截重新启动的判断为:
intent.flags and Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT != 0
结尾
启动新应用的方案,目前只知道以上三种方案,如果还有请在评论中指出,共同进步呀
来源地址:https://blog.csdn.net/qq_39734865/article/details/131751983