Android网页唤醒App相关介绍

本文主要总结网页唤醒 APP 相关的知识点


网页打开app操作指南

Uri Scheme(配置 intent-filter)

在AndroidManifest.xml中设置:

  • 支持浏览器打开
  • 浏览器打开需要的配置跳转参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <activity android:name=".MainActivity">
    <!-- 需要添加下面的intent-filter配置 -->
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data
    android:host="top"
    android:path="/blogs"
    android:port="8888"
    android:pathPrefix="/test"
    android:scheme="goluck" />
    </intent-filter>
    </activity>

编写测试网页

  • 如果手机安装了我的测试apk,可以手机访问该网页
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <html>
    <head>
    <meta charset="UTF-8">
    </head>
    <body>
    <h1>以下两种方式可以打开测试APP</h1>
    <a href="market://details?id=top.goluck.applinks_2018_10_7">通过网页打开应用商店(open app with market)</a>
    <br/>
    <br/>
    <a href="goluck://top:8888/blogs?key1=values1&key2=values2">通过scheme打开指定页面(open app with Uri Scheme)</a>
    <br/>
    <br/>
    </body>
    </html>

短信打开app

  • 将需要打开的网址发送短信给用户
  • 其次将该网址加上重定向即可,即先访问点击短信中的url然后再访问网页的url,其次通过网页的url重定向打开当前的app
    1
    <meta http-equiv="Refresh" content="0;url=goluck://top:8888/blogs?key1=values1&key2=values2" />

原理

  • Android 6.0 的原生浏览器的 shouldOverrideUrlLoading 方法,核心实现类UrlHandler

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    final static String SCHEME_WTAI = "wtai://wp/";
    final static String SCHEME_WTAI_MC = "wtai://wp/mc;";
    boolean shouldOverrideUrlLoading(Tab tab, WebView view, String url) {
    if (view.isPrivateBrowsingEnabled()) {
    //不允许url离开浏览器应用程序在 隐私浏览模式
    return false;
    }
    if (url.startsWith(SCHEME_WTAI)) {
    // wtai://wp/mc;number
    // number=string(phone-number)
    if (url.startsWith(SCHEME_WTAI_MC)) {
    Intent intent = new Intent(Intent.ACTION_VIEW,
    Uri.parse(WebView.SCHEME_TEL +
    url.substring(SCHEME_WTAI_MC.length())));
    mActivity.startActivity(intent);
    //在离开BrowserActivity之前,关闭空子选项卡。
    //如果通过JavaScript打开创建新选项卡以加载此// url,我们想关闭它,因为我们将在//不同的Activity中加载此URL。
    mController.closeEmptyTab();
    return true;
    }
    //……
    }
  • 相关讲解

  • 注意事项

    • 首先需要在 AndroidManifest.xml 中定义 scheme,scheme 不能和 http、https、ftp、sms、mailto 等已使用的相同。
    • 在 Android M 之前,如果点击一个链接有多个 APP 符合,会弹出对话框,询问用户选择哪个应用打开 - 包括浏览器应用。
    • 谷歌在Android M上实现了一个自动认证(auto-verify)机制,让开发者可以避开这个弹出框,使用户不必去选择一个列表,直接跳转到他们的APP。

相关参考