欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

2020-12-06

程序员文章站 2022-06-17 18:48:08
主要说明Navigation DeepLink的源代码,看如下过程的现实1:DeepLink 三个参数详解2:DeepLink 参数解析过程 3:Navgation导航目标生成过程4:Navgation如何现实导航到指定目标的...

Jetpack DeepLink

1.DeepLink 详解




前言

主要说明Navigation DeepLink的源代码,看如下过程的现实
1:DeepLink 三个参数详解 ,
2:DeepLink 参数解析过程 ,
3:Navgation导航目标生成过程 ,
4:Navgation如何现实导航到指定目标的,


Navigation 参数

    <declare-styleable name="NavDeepLink">
        <attr format="string" name="uri"/>
        <attr format="string" name="action"/>
        <attr format="string" name="mimeType"/>
        <attr name="android:autoVerify"/>
    </declare-styleable>

URI 参数说明

URI参考资料

https://tools.ietf.org/html/rfc3986
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web

URI格式介绍

1. Scheme://Authority:Port/Path?Query#Fragment

完整URI链接:

2.http://www.example.com:80/path/to/myfile.html?
key1=value1&key2=value2#SomewhereInTheDocument

对应关系:

Scheme ->http
Authority->www.example.com
80->port
Path->/path/to/myfile.html
Query->key1=value1&key2=value2
Fragment->SomewhereInTheDocument

URI标准scheme说明描述

Scheme Description
data Data URIs
file Host-specific file names
ftp File Transfer Protocol
http/https Hyper text transfer protocol (Secure)
javascript URL-embedded JavaScript code
mailto Electronic mail address
ssh Secure shell
tel telephone
urn Uniform Resource Names
view-source Source code of the resource
ws/wss WebSocket connections (Secure)

mimeType 类型说明

mime全称

 Mine:什么是 Multipurpose Internet Mail Extensions 

参考资料

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types

例子

类型 描述 典型示例
text 表明文件是普通文本, 理论上是人类可读 text/plain, text/html, text/css, text/javascript
image 表明是某种图像。不包括视频,但是动态图(比如动态gif)也使用image类型 image/gif, image/png, image/jpeg, image/bmp, image/webp, image/x-icon, image/vnd.microsoft.icon
audio 表明是某种音频文件 audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
video 表明是某种视频文件 video/webm, video/ogg
application 表明是某种二进制数据 application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf

Action参数

Google官方描述:

操作的名称。某些标准操作在 Intent 类中定义为 ACTION_string 常量。要将其中一项操作分配给此属性,请在 ACTION_ 后跟的 string 前面加上“android.intent.action.”。例如,对于 ACTION_MAIN,请使用“android.intent.action.MAIN”;对于 ACTION_WEB_SEARCH,请使用“android.intent.action.WEB_SEARCH”。
对于您定义的操作,最好将应用的软件包名称用作前缀,以确保唯一性
例如:
可按如下方式指定 TRANSMOGRIFY 操作:
<action android:name="com.example.project.TRANSMOGRIFY" />

navigation action参数应该怎么写

  <fragment android:id="@+id/loan_main"
        android:name="com.hc.load.LoanMainFragment"
        tools:layout="@layout/fragment_loan_input_money_layout" >
        <deepLink
            android:id="@+id/deepLink"
            app:action="${applicationId}.LoanMainFragment"
          	/>
  </fragment>

为什么这样写,最后解析的结果是什么

  • 1.下面这段代码中是在NavInflater解析src/main/res/navigation/xxx.xml一段代码。
  • 2.这段代码主要解析的就是我们要将的DeepLink参数部分。
  • APPLICATION_ID_PLACEHOLDER的值就是"${applicationId}" ,如果我们的参数中包含
    这个"${applicationId}"那么会被直接替换成包名。’
  • 前面讲过为什么使用包名,主要是保证唯一性
 private void inflateDeepLink(@NonNull Resources res, @NonNull NavDestination dest, @NonNull AttributeSet attrs) throws XmlPullParserException {
        final TypedArray a = res.obtainAttributes(attrs, R.styleable.NavDeepLink);
        String uri = a.getString(R.styleable.NavDeepLink_uri);
        String action = a.getString(R.styleable.NavDeepLink_action);
        String mimeType = a.getString(R.styleable.NavDeepLink_mimeType);
        if (TextUtils.isEmpty(uri) && TextUtils.isEmpty(action) && TextUtils.isEmpty(mimeType)) {
            throw new XmlPullParserException("Every <" + TAG_DEEP_LINK
                    + "> must include at least one of app:uri, app:action, or app:mimeType");
        }
        NavDeepLink.Builder builder = new NavDeepLink.Builder();
        if (uri != null) {
            builder.setUriPattern(uri.replace(APPLICATION_ID_PLACEHOLDER,
                    mContext.getPackageName()));
        }
        if (!TextUtils.isEmpty(action)) {
            builder.setAction(action.replace(APPLICATION_ID_PLACEHOLDER,
                    mContext.getPackageName()));
        }
        if (mimeType != null) {
            builder.setMimeType(mimeType.replace(APPLICATION_ID_PLACEHOLDER,
                    mContext.getPackageName()));
        }
        dest.addDeepLink(builder.build());
        a.recycle();
    }

下面给一个完整的DeepLink给如何配置的例子

1.例子
2.源代码解读。
3.常用方式。
1.参数传递

总结

今天先到这里,明天继续

本文地址:https://blog.csdn.net/shaohuazuo/article/details/110784840