Android 打开其他应用的方式

很多时候,我们会想打开第三方应用,比如广告中判断应用是否安装,如果安装就跳转该应用首页,未安装则去应用商店该应用详情页。
那么接下来就讲讲几种打开第三方应用首页的方案。

通过包名跳转

知道包名跳转有以下三种

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都没有
<category android:name=“android.intent.category.LAUNCHER” />
那么在手机桌面上该应用图标就会被隐藏,当然在主activity还是得设置以下的<intent-filter>

<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.MainActivity
	val 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

结尾

启动新应用的方案,目前只知道以上三种方案,如果还有请在评论中指出,共同进步呀

猜你喜欢

转载自blog.csdn.net/qq_39734865/article/details/131751983
今日推荐