当前位置:网站首页>【荣耀智慧服务】快捷服务开发指南

【荣耀智慧服务】快捷服务开发指南

2022-08-10 16:03:00 InfoQ

 荣耀快捷服务是荣耀智慧服务的快捷入口之一,用户点击负一屏 > 我的服务 > 最右侧“更多”按钮,拖到想要添加的图片到“自定义服务”中,即可在快捷服务列表页面中,将想要添加的快捷服务卡片。快捷服务因丰富多样、方便快捷的特点,广受用户和开发者青睐。

null

快捷服务主要通过开发者提供每个服务deeplink进行跳转,服务以图标或文字链接方式呈现,用户点击服务通过deeplink跳转到APP或者RPK内某个指定页面,方便、便捷。
1. Android Deeplink 开发指南
Deep Linking(译:深度链接)它的实现原理,是使用Uri Scheme协议来实现。
1.1 Deep Linking能做什么
1.1.1 它可以唤起指定应用并向其传递数据,根据传递的数据显示特定内容页的详细信息;
1.1.2 它不再受制于应用,只通过一个链接便可唤起应用并跳转到指定页面;
1.1.3 它使应用之间产生了联系,使应用不再孤立存在;
1.1.4 它优化了用户体验,这一点是它最终要达到的目的。
 
1.2 官方解释
当单击链接或编程请求调用Web URI意图时,Android系统按顺序依次尝试以下每一个操作,直到请求成功为止:
1.2.1 打开用户首选的应用程序,它可以处理URI,如果指定的话。
1.2.2 打开可以处理URI的唯一可用应用程序。
1.2.3 允许用户从对话框中选择应用程序。
官方文档:
https://developer.android.com/training/app-links/deep-linking
2. URL Scheme 协议格式
scheme://host/path:port/path?query1=xxxx&query2=xxxx
例如:
deeplinkapp://com.mytest.deeplink:8080/deeplinkDetail?param1=test
上面包含了 scheme、host、port、path、query。
deeplinkapp:代表该 Scheme 协议名称(scheme)。
com.mytest.deeplink:代表 Scheme 作用于哪个地址域(host)。
8080:代表路径端口号(port)。
deeplinkDetail:代表 Scheme 指定的页面(path)。
param1:代表传递的参数名称(query)。
 
3. 使用 DeepLink
3.1 修改manifest文件
我们需要在清单文件 manifest 中对于要开放给外部的activity添加 intent-filter。配置如下:
<
activity
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
android:name
=&quot;
.******Activity
&quot;>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<
intent-filter
>
< !—必须设置-->
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<
action 
android:name
=&quot;
android.intent.action.VIEW
&quot;
 
/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<
category 
android:name
=&quot;
android.intent.category.DEFAULT
&quot;
 
/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<
category 
android:name
=&quot;
android.intent.category.BROWSABLE
&quot;
 
/>
< !--协议部分,自主设置-->
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<
data
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
android:scheme
=&quot;
****
&quot;
 
<
 
!—如android:scheme
=&quot;
deeplinkapp
&quot;
--
>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:host=&quot;****&quot;&nbsp;&nbsp; < !—如android:host=&quot;com.mytest.deeplink&quot;-->
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:port=&quot;****&quot;&nbsp;&nbsp; < !—如android:port=&quot;8080&quot; -->
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:path=&quot;****&quot;&nbsp;&nbsp; < !—如android:path=&quot;deeplinkDetail&quot; -->
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; < /intent-filter>
&nbsp;< /activity>
3.2 代码处理
在对应 Activity 中的添加逻辑处理代码:
if (getIntent() != null && getIntent().getData() != null)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Uri uri = getIntent().getData();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 完整的url信息
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String url = uri.toString();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // scheme部分
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String scheme = uri.getScheme();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // host部分
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String host = uri.getHost();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //port部分
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int port = uri.getPort();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 访问路径
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String path = uri.getPath();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Query部分
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String query = uri.getQuery();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //获取指定参数值
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String param1= uri.getQueryParameter(&quot;param1&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

4. 测试
4.1 使用 adb 命令
&nbsp;&nbsp; $ adb shell am start -a android.intent.action.VIEW –d
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adb shell am start -a android.intent.action.VIEW –d deeplinkapp://com.mytest.deeplink:8080/deeplinkDetail?
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; param1=test com.mytest.deeplink
4.2 使用web打开
替换deeplink.html中的deeplink地址,拷贝文件到手机,使用浏览器打开html即可
Deeplink.html:
&nbsp;
<!
DOCTYPE html
>
<
html
>
<
head
>
&nbsp;&nbsp;&nbsp; 
<
title
>
deeplink test
</
title
>
</
head
>
<
body
>
&nbsp;&nbsp;&nbsp; 
<
href
=&quot;
deeplinkapp://com.mytest.deeplink:8080/deeplinkDetail?param1=test
&quot;>
打开APP
</
a
>
</
body
>
<
html
>
5. Apk和Rpk的deeplink查询或获取方法
5.1 Apk(Android)的deeplink查询或获取方法
5.1.1 请跟产品经理或者开发人员确认应用的页面已经支持deeplink。
Deeplink格式如下:
[scheme]://[host]/[path]?[query]
&nbsp;
5.1.2 获取应用的AndroidManifest文件,找到对应页面的Activity配置。
示例:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<
activity
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 
android:name
=&quot;
com.example.android.GizmosActivity
&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 
android:label
=&quot;
@string/title_gizmos
&quot;
 
>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; < intent-filter android:label=&quot;@string/filter_view_http_gizmos&quot;>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; < action android:name=&quot;android.intent.action.VIEW&quot; />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; < category android:name=&quot;android.intent.category.DEFAULT&quot; />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; < category android:name=&quot;android.intent.category.BROWSABLE&quot; />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; < !-- Accepts URIs that begin with &quot;http://www.example.com/gizmos” -->
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; < !-- note that the leading &quot;/&quot; is required for pathPrefix-->
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; < /intent-filter>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; < intent-filter android:label=&quot;@string/filter_view_example_gizmos&quot;>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; < action android:name=&quot;android.intent.action.VIEW&quot; />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; < category android:name=&quot;android.intent.category.DEFAULT&quot; />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; < category android:name=&quot;android.intent.category.BROWSABLE&quot; />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; < !-- Accepts URIs that begin with &quot;example://gizmos” -->
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; < data android:scheme=&quot;example&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:host=&quot;testhost&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:pathPrefix=&quot;/gizmos&quot; />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; < /intent-filter>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; < /activity>
5.1.3 查看intent-filter标签中的data标签,标签中的scheme和host的值分别对应deeplink中的scheme和host字段。
&nbsp;
5.1.4 对于path,data标签中共支持path,pathPattern,pathPrefix三种设置方式,其意义分别如下:
Path:指定了完整的path路径,必须跟配置的值完全一样,应用才会处理;
pathPattern:指定了完整path的正则表达式,即传入的path必须满足pathPattern指定的正则表达式应用才会处理;
pathPrefix:指定了path的前缀,即传入的path以pathPrefix的值为前置即可处理;
query代表传入到页面的参数,其为key-value值对,多个参数间用&连接。
&nbsp;
5.2 Rpk(快应用)的deeplink查询或获取方法
详情参考快应用
deeplink
文档。
Deeplink参数添加方式:
负一屏或其他卡片宿主,通过deeplink或者router.push跳转打开快应用,无论是否有历史留存页面,都可以直接跳转目标落地页,返回可一键返回至宿主应用页面。
5.2.1 原跳转链接无具体页面,只有包名,如:
hap://app/com.freecharge.android.quickapp
则在后面添加hap://app/com.freecharge.android.quickapp/?___PARAM_LAUNCH_FLAG___=clearTask&nbsp;
&nbsp;注意:
&quot;/?&quot;都不能少
&nbsp;
5.2.2 原跳转链接有指定跳转目录,但无跳转参数,如:
hap://app/org.hap.govaffairs/views/HealthQrcode/Result
在后面添加hap://app/org.hap.govaffairs/views/HealthQrcode/Result?___PARAM_LAUNCH_FLAG___=clearTask&nbsp;
&nbsp;注意:
&quot;?&quot;不能少
&nbsp;
5.2.3 原跳转链接本身就有指定跳转目录和跳转参数,如:
hap://app/com.wifi.quickapp.reader.free/Page/Go?path=read&bookid=70317&chapterid=15688960
在后面添加 hap://app/com.wifi.quickapp.reader.free/Page/Go?path=read&bookid=70317&chapterid=15688960&___PARAM_LAUNCH_FLAG___=clearTask
&nbsp;注意:
&quot;&&quot;不能少
原网站

版权声明
本文为[InfoQ]所创,转载请带上原文链接,感谢
https://xie.infoq.cn/article/977bfe268b577bf7c9ef9cc43