当前位置:   article > 正文

Android App links 链接打开app功能

app links

1、深链接Deep link(URI SCHEME协议)

深链接即我们通常说的scheme跳转,需要我们在清单文件中对activity添加intent-fillter,并定义scheme(包括但不限于HTTP协议)。如果用户手机内安装了多款能响应链接启动的应用,那么系统会弹出一个选择器,让用户自主选择用哪个应用打开。

2、安卓软件链接组 Android App Links

Android App Links是6.0以后才支持的链接方式,APP通过定义一组你自有的HTTP URL将该其设置为系统的默认打开对应域名的地址的应用(注意区分:不是6.0以下的默认打开某类数据)。当用户点击了包含你的域名的链接时,系统默认用你的APP打开该链接,如果用户手机未安装你的APP,那么会直接用浏览器打开。手机里的其他应用则不能打开。

3、两种区别

其实是一种技术的两种使用方式而已

区别项Deep linkApp Links
Intent URL schemehttp,https,自定义协议http,https
Intent action任何action需要android.intent.action.VIEW
Intent category任何category需要android.intent.category.BROWSABLE和android.intent.category.DEFAULT
链接验证不验证通过DAL文件和https验证
用户体验可能会弹出一个APP选择弹框让用户选择用哪个应用打开不弹APP选择弹框,直接用你的APP打开(已安装,否则直接打开网页)
兼容性所有版本系统6.0及以上

代码上的区别
在这里插入图片描述

因此,Android App Links相对于Deep link有以下几点优势:
1、安全:因为只有你自己的APP能打开,所以很可靠;
2、无缝的用户体验:因为只有自己的APP可以打开,所以不会出现让用户选择哪个应用的打开的弹框,如果用户没有安装你的APP,则直接用浏览器打开。
3、支持免安装的谷歌应用:当然,这条优势对国内开发者来说没什么影响,因为谷歌的免安装应用需要上传到google player。
4、支持从浏览器、谷歌搜索APP、手机快捷搜索和谷歌助手等多个地方通过链接启动APP。
但是,因为国内room厂商众多,如果在浏览器中打开链接,因为各方浏览器不一致,类似这种功能被限制了,往往会跳转新的网页,致使不能唤起APP。

Deep link支持:
当用户点击一个链接时,系统默认按以下顺序打开:
1、如果你设置了默认打开应用,则优先使用该应用打开;
2、如果只有一个应用能打开,则直接用该应用打开;
3、如果有多个应用能打开,才会弹出应用选择弹框。

4、代码实现

1.在清单文件中配置协议

AndroidManifest.xml

        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:label="活动中心"
            android:theme="@style/Theme.AppLinksDemo">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="app.xxxx.com"
                    android:pathPrefix="/app/activityCenter"
                    android:scheme="myApp" />
            </intent-filter>
        </activity>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
2.在Activity中实现代码

MainActivity.kt
因为页面可能第一次开启,也可能是在后台存活,故也需要在onNewIntent方法中进行判断是否有数据

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        WindowCompat.setDecorFitsSystemWindows(window, false)
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        
        
        parseIntent(intent)

    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        parseIntent(intent)
    }

    private fun parseIntent(intent: Intent?) {
		if(intent==null){
			return
		}
        val appLinkAction = intent.action
        val appLinkData = intent.data
        //如果没有deep link信息,这里为空
        appLinkData?.let {
            val authority = appLinkData.authority
            val path = appLinkData.path
            val query = appLinkData.query
            binding.textviewFirst.text = "linkData:${appLinkData.toString()}"
        }
        
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
3.第一种通过app入口应用 均可以唤起APP
binding.textviewFirst.setOnClickListener {
    val intent=Intent(Intent.ACTION_VIEW)
    intent.data= Uri.parse("myApp://app.xxx.com/app/activityCenter?activityId=123456")
    startActivity(intent);
}
  • 1
  • 2
  • 3
  • 4
  • 5
4.第二种通过浏览器中的链接均可以唤起APP
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>App link</title>
</head>
<body>
  <a href="myApp://app.xxx.com/app/activityCenter?activityId=123456" style><font size="20">跳转打开活动中心123456</font></a>
</body>
</html>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
5.当页面被打开时,判断意图是否有数据进入
 appLinkData?.let {
      val authority = appLinkData.authority
      val path = appLinkData.path
      val query = appLinkData.query
      binding.textviewFirst.text = "linkData:${appLinkData.toString()}"
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
6.根据链接协议的的参数内容进行业务逻辑的跳转

scheme是协议信息,当前demo中为myApp
authority是域名信息
path是路径信息,可选值
query是连接中的参数信息
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/296752
推荐阅读
相关标签
  

闽ICP备14008679号