写点什么

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

  • 2022 年 8 月 10 日
    中国香港
  • 本文字数:3722 字

    阅读完需:约 12 分钟

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



快捷服务主要通过开发者提供每个服务 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

      android:name=".******Activity">

        <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:scheme="****" < !—如 android:scheme="deeplinkapp"-->

              android:host="****"   < !—如 android:host="com.mytest.deeplink"-->

              android:port="****"   < !—如 android:port="8080" -->

              android:path="****"   < !—如 android:path="deeplinkDetail" -->

              />

        < /intent-filter>

 < /activity>

3.2 代码处理

在对应 Activity 中的添加逻辑处理代码:

if (getIntent() != null && getIntent().getData() != null)

               {

               Uri uri = getIntent().getData();

                   // 完整的 url 信息

                   String url = uri.toString();

                   // scheme 部分

                   String scheme = uri.getScheme();

                   // host 部分

                   String host = uri.getHost();

                   //port 部分

      int port = uri.getPort();

                   // 访问路径

                   String path = uri.getPath();

                   // Query 部分

                   String query = uri.getQuery();

                   //获取指定参数值

                   String param1= uri.getQueryParameter("param1");

       }


4. 测试

4.1 使用 adb 命令

   $ adb shell am start -a android.intent.action.VIEW –d

               例如:

               adb shell am start -a android.intent.action.VIEW –d deeplinkapp://com.mytest.deeplink:8080/deeplinkDetail?

               param1=test com.mytest.deeplink

4.2 使用 web 打开

替换 deeplink.html 中的 deeplink 地址,拷贝文件到手机,使用浏览器打开 html 即可

Deeplink.html:

 

<!DOCTYPE html>

<html>

<head>

    <title>deeplink test</title>

</head>

<body>

    <a href="deeplinkapp://com.mytest.deeplink:8080/deeplinkDetail?param1=test">打开 APP</a>

</body>

<html>

5. Apk 和 Rpk 的 deeplink 查询或获取方法

5.1 Apk(Android)的 deeplink 查询或获取方法

5.1.1 请跟产品经理或者开发人员确认应用的页面已经支持 deeplink。

Deeplink 格式如下:

[scheme]://[host]/[path]?[query]

 

5.1.2 获取应用的 AndroidManifest 文件,找到对应页面的 Activity 配置。

示例:

               <activity

                   android:name="com.example.android.GizmosActivity"

                   android:label="@string/title_gizmos" >

                   < intent-filter android:label="@string/filter_view_http_gizmos">

                       < action android:name="android.intent.action.VIEW" />

                       < category android:name="android.intent.category.DEFAULT" />

        < category android:name="android.intent.category.BROWSABLE" />

                       < !-- Accepts URIs that begin with "http://www.example.com/gizmos” -->

                       < !-- note that the leading "/" is required for pathPrefix-->

                   < /intent-filter>

                   < intent-filter android:label="@string/filter_view_example_gizmos">

                       < action android:name="android.intent.action.VIEW" />

                       < category android:name="android.intent.category.DEFAULT" />

                       < category android:name="android.intent.category.BROWSABLE" />

                       < !-- Accepts URIs that begin with "example://gizmos” -->

                       < data android:scheme="example"

                             android:host="testhost"

                             android:pathPrefix="/gizmos" />

                   < /intent-filter>

               < /activity>

5.1.3 查看 intent-filter 标签中的 data 标签,标签中的 scheme 和 host 的值分别对应 deeplink 中的 scheme 和 host 字段。

 

5.1.4 对于 path,data 标签中共支持 path,pathPattern,pathPrefix 三种设置方式,其意义分别如下:

Path:指定了完整的 path 路径,必须跟配置的值完全一样,应用才会处理;

pathPattern:指定了完整 path 的正则表达式,即传入的 path 必须满足 pathPattern 指定的正则表达式应用才会处理;

pathPrefix:指定了 path 的前缀,即传入的 path 以 pathPrefix 的值为前置即可处理;

query 代表传入到页面的参数,其为 key-value 值对,多个参数间用 &连接。

 

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 

 注意:

"/?"都不能少

 

5.2.2 原跳转链接有指定跳转目录,但无跳转参数,如:

hap://app/org.hap.govaffairs/views/HealthQrcode/Result

在后面添加 hap://app/org.hap.govaffairs/views/HealthQrcode/Result?___PARAM_LAUNCH_FLAG___=clearTask 

 注意:

"?"不能少

 

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

 注意:

"&"不能少

用户头像

还未添加个人签名 2022.06.28 加入

还未添加个人简介

评论

发布
暂无评论
【荣耀智慧服务】快捷服务开发指南_开发者_荣耀开发者服务平台_InfoQ写作社区