• Android App links 链接打开app功能


    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.niceloo.com"
                        android:pathPrefix="/app/activityCenter"
                        android:scheme="youlu" />
                </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()
    
        }
    
        override fun onNewIntent(intent: Intent?) {
            super.onNewIntent(intent)
            parseIntent()
        }
    
        private fun parseIntent() {
    
            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

    3.第一种通过app入口应用 均可以唤起APP

    binding.textviewFirst.setOnClickListener {
        val intent=Intent(Intent.ACTION_VIEW)
        intent.data= Uri.parse("youlu://app.niceloo.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="youlu://app.niceloo.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.当页面被打开时,判断意图是否有数据进入

    在这里插入图片描述

    6.根据链接协议的的参数内容进行业务逻辑的跳转

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

  • 相关阅读:
    测量信号的功率
    git操作将本地的代码推送到远程仓库
    Java Class类简介说明
    SQL分层查询
    ECharts常用配置
    搜狗收录量易语言查询代码
    ES6数组的方法及伪数组转数组方法
    从零开始基于LLM构建智能问答系统的方案
    C语言操作符详解(二)
    三十多年前 钱学森给虚拟现实技术取了一个名
  • 原文地址:https://blog.csdn.net/u011106915/article/details/126387570