• 深度链接和延迟深度链接的学习


     

    一、什么是深度链接(Deeplink)技术?

    “Deeplink”又名“深度链接”,是一种能将用户直接从网页带到App指定页面的技术。

    目前广义上的“深度链接”概念包含了 DeepLink 和 Deferred Deeplink,主要触发场景分为两种:

    • 用户已安装目标App情况下:在web网页点击链接,就能直接跳转到App内指定页面。
    • 用户未安装目标App情况下:在web网页点击链接,会先跳转应用商店,下载后首次打开App,会自动跳转到指定页面。

     

    1.深度链接

    • 什么是深度链接?

    深度链接(DeepLink):对于已经安装了的APP,把需要的参数通过URL的形式传递给APP,指向特定的App页面。是从外部链接到APP内部的直接跳转。

     

    • 深度链接的原理

    DeepLink,本质上是使用URI的Schema,移动操作系统提供解析schema的功能,判断schema属于哪个app,唤起并将参数传递给APP.

    • URL Scheme的协议样式如下:   

      Scheme://host:port/path?query

      ● Scheme:代表Scheme协议名称,可自定义

      ● host:代表Scheme作用的地址域

      ● port:代表该路径的端口号

      ● path:代表的是想要跳转的指定页面(路径)

      ● query:代表想要传递的参数

    工作流程是:当用户点击此类深度链接时—>操作系统提供解析URL Scheme的能力—>判断属于哪个App、是否安装了App—>唤醒App并传递需要的参数。

    Demo用例:

    首先,自行定义一个网页,这涉及到前端的内容,本人学识浅薄,怎么去写个网页,这大家可以到网上搜。

    0271b5a437864cab8b0600fb89dbf686.png

     然后便是manifests配置

    1. "1.0" encoding="utf-8"?>
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    3. package="com.example.demo2">
    4. <uses-permission android:name="android.permission.INTERNET"/>
    5. <application
    6. android:allowBackup="true"
    7. android:icon="@mipmap/ic_launcher"
    8. android:label="@string/app_name"
    9. android:roundIcon="@mipmap/ic_launcher_round"
    10. android:supportsRtl="true"
    11. android:theme="@style/Theme.AppCompat.NoActionBar">
    12. <activity
    13. android:name=".MainActivitywhat"
    14. android:exported="true">
    15. <intent-filter>
    16. <action android:name="android.intent.action.MAIN" />
    17. <category android:name="android.intent.category.LAUNCHER" />
    18. intent-filter>
    19. <intent-filter>
    20. <action android:name="android.intent.action.VIEW"/>
    21. <category android:name="android.intent.category.BROWSABLE"/>
    22. <category android:name="android.intent.category.DEFAULT"/>
    23. <data android:scheme="test" android:host="tp" android:pathPrefix="/open"/>
    24. intent-filter>
    25. activity>
    26. application>
    27. manifest>

    这里,是通过Intent隐式意图实现。

    lv_0_20220907173127

    2.延迟深度链接

     

    1.从当前应用跳转到应用商店。

    1. package com.example.myapplication;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import android.content.Context;
    4. import android.content.Intent;
    5. import android.net.Uri;
    6. import android.os.Bundle;
    7. import android.view.View;
    8. import android.widget.Button;
    9. public class MainActivity extends AppCompatActivity {
    10. @Override
    11. protected void onCreate(Bundle savedInstanceState) {
    12. super.onCreate(savedInstanceState);
    13. setContentView(R.layout.activity_main);
    14. Button button = findViewById(R.id.button);
    15. button.setOnClickListener(new View.OnClickListener() {
    16. @Override
    17. public void onClick(View view) {
    18. gotoStore();
    19. }
    20. });
    21. }
    22. public void gotoStore(){
    23. Uri uri = Uri.parse("market://search?");
    24. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    25. startActivity(intent);
    26. }
    27. }

    2.判断应用是否安装,如果安装则直接打开对应的app,否则,跳转到应用商店下载。

    修改后的代码:

    1. package com.example.myapplication;
    2. import androidx.annotation.RequiresApi;
    3. import androidx.appcompat.app.AppCompatActivity;
    4. import android.content.ComponentName;
    5. import android.content.Context;
    6. import android.content.Intent;
    7. import android.content.pm.PackageManager;
    8. import android.content.pm.VersionedPackage;
    9. import android.net.Uri;
    10. import android.os.Build;
    11. import android.os.Bundle;
    12. import android.view.View;
    13. import android.widget.Button;
    14. import java.util.List;
    15. public class MainActivity extends AppCompatActivity {
    16. @Override
    17. protected void onCreate(Bundle savedInstanceState) {
    18. super.onCreate(savedInstanceState);
    19. setContentView(R.layout.activity_main);
    20. Button button = findViewById(R.id.button);
    21. button.setOnClickListener(new View.OnClickListener()
    22. {
    23. @RequiresApi(api = Build.VERSION_CODES.O)
    24. public void onClick(View view) {
    25. if(checkAppInstall("com.example.demo2"))
    26. {
    27. //打开已经安装的app
    28. ComponentName componentName=new ComponentName("com.example.demo2","com.example.demo2.MainActivitywhat");
    29. Intent intent=new Intent();
    30. intent.setComponent(componentName);
    31. startActivity(intent);
    32. }
    33. else
    34. { //跳转应用商店
    35. gotoStore();
    36. }
    37. }
    38. });
    39. }
    40. @RequiresApi(api = Build.VERSION_CODES.O)
    41. public boolean checkAppInstall( String PackName){
    42. PackageManager pm=getPackageManager();
    43. boolean installed=false;
    44. try {
    45. pm.getPackageInfo(PackName,PackageManager.GET_ACTIVITIES);
    46. installed=true;
    47. } catch (PackageManager.NameNotFoundException e) {
    48. e.printStackTrace();
    49. installed =false;
    50. }
    51. return installed;
    52. }
    53. public void gotoStore(){
    54. Uri uri = Uri.parse("market://search?");
    55. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    56. startActivity(intent);
    57. }
    58. }

     

     

  • 相关阅读:
    微服务使用指南
    刷透近200道数据结构与算法,成功加冕“题王”,挤进梦中的字节
    Linux系统上2个非常有意思也最特殊的目录/run和/proc的作用以及监测项
    【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 3
    修改和完成SpringSecurity的登录功能
    提高生产力和降低成本:CISO的网络安全绩效指标
    【PHP】医院HIS手术麻醉临床信息管理系统源码 实现术前、术中、术后全流程管理
    23_ue4人物控制切换
    关于深度图与鸟瞰图之间转换的问题
    node.js原生模块
  • 原文地址:https://blog.csdn.net/qq_58259539/article/details/126746871