乐趣区

Android-自定义scheme及多端唤起使用方法

前言

DeepLink,深度链接技术,类似于 web 开发领域不仅仅是通过链接打开一个界面,而是打开界面的某个具体内容。常用于 web 端唤起 app 时,传递参数直接打开确定的界面,如通过京东的分享出去的商品详情页,实现在京东 app 中打开。

在移动开发领域,是指 app 在处理特定的 url 时能够直接跳转到对应的内容页面或者触发特定的逻辑。这样可以在 web 端切换 app 时通过参数传递保留了当前的上下文状态,又可以借用 web 端的优势,更利于传播,可利用搜索引擎的索引,增加 app 的日活和下载量等。

移动端实现 deeplink 于是就有了 Universal Link、App Link、URL schemes 等

Android 配置 scheme

如配置 WebActivity 完整的打开链接为openapp://test:8000/detail,需要在 AndroidManifest.xml 配置

<activity android:name=".WebActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <!-- 需要被 js 调起必须设置 -->
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- 协议部分 -->
        <data
            android:host="test"
            android:path="/detail"
            android:port="8000"
            android:scheme="openapp" />
    </intent-filter>
</activity>

协议部分:(类比于 http://locahost:8080/home)

  • android:scheme:协议名,类似于http
  • android:host:主机名,类似于locahost
  • android:port:端口名。类似于 8080 中的端口
  • android:path: 路径名,类似于home
  • 还可以配置 imei 等等。结构为<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

Android 端调起

通过指定 Intent 的 Action 为Intent.ACTION_VIEW,传入解析的 Uri

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("openapp://test:8000/detail?title= 电视影音 &url=https://u.jd.com/1dfFwO"));
startActivity(intent);

传递参数的方法跟 web 端一样,通过问号 ? 分隔,参数名和值之间使用等号 = 连接,多个参数之间使用 & 拼接。

Android 端参数接收

Uri uri = getIntent().getData();
if (uri != null) {
    // 完整的 url 信息
    String totalUrl = uri.toString();
    Log.i(TAG, "完整 url:" + totalUrl);
    // scheme 协议
    String scheme = uri.getScheme();
    Log.i(TAG, "scheme:" + scheme);
    // host 主机
    String host = uri.getHost();
    Log.i(TAG, "host:" + host);
    //port 端口
    int port = uri.getPort();
    Log.i(TAG, "port:" + port);
    // 访问路径
    String path = uri.getPath();
    Log.i(TAG, "path:" + path);
    // 获取所有参数
    String query = uri.getQuery();
    Log.i(TAG, "query:" + query);
    // 获取指定参数值
    String title = uri.getQueryParameter("title");
    Log.i(TAG, "title:" + title);
    String url = uri.getQueryParameter("url");
    Log.i(TAG, "url:" + url);
}

唤起后可以看见打印的日志信息:

拿到参数之后就可以进行后续的使用操作啦

web 端唤起

直接当做一个普通的连接形式,直接跳转

window.location = "openapp://test:8000/detail?title= 电视影音 &url=https://u.jd.com/1dfFwO";  

或者设置超链接等待用户点击

<a href="openapp://test:8000/detail?title= 电视影音 &url=https://u.jd.com/1dfFwO"> 在 app 中打开 </a>

原文链接

???? 更多好文欢迎关注我的公众号~

退出移动版