2020-12-06
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