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 link App Links
Intent URL scheme http,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>

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()}"
        }
        
    }

}

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);
}

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>

5.当页面被打开时,判断意图是否有数据进入

在这里插入图片描述

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

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

猜你喜欢

转载自blog.csdn.net/u011106915/article/details/126387570