点击APP外部链接唤醒APP的研究

有个需求,是点击短信中的(或者是其他地方的)URL,能够唤起APP。

思路,首先找个实现了的APP做测试。

选择手机淘宝做研究。

在淘宝中把宝贝链接分享到微信,结果如下:


直接点开,跳转到微信的内建浏览器,指示用户通过浏览器打开:


点击在浏览器中打开,效果为弹窗显示所有的浏览器APP,提示选择一个浏览器。此时使用淘宝打开即跳转到APP


把链接内容作为短信发送给自己,点击短信中的链接,效果:

1.首先弹出安卓系统默认浏览器,展现出宝贝页面

2.马上跳转到淘宝APP内,并展示宝贝


差异:

1.微信使用内建浏览器打开;短信一般使用系统浏览器打开。

分析:微信的实现是使用自定义的WebView;系统的实现是指定意图,并显示打开指定的浏览器。

2.微信页面打开之后,需要选择打开的应用;短信打开的页面可以直接跳转。

分析:短信可以跳转,不是通过自定义WebView,无法使用JS接口,而且是能通过第三方APP跳转,一定是通过安卓系统组件实现的跳转,不是直接跳转,说明只能拦截系统默认浏览器中的URL跳转操作才能实现跳APP;

微信无法跳转,猜测可能是对scheme特殊的URL进行了拦截。


查找了资料,可以通过修改manifest来实现一个Activity接收传递来的URL:

        <activity
            android:name=".activity.UrlJumpActivity">
            <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="http"/>
            </intent-filter>
        </activity>


然后自己写Demo程序。

猜想如果点击web链接能够跳转到指定APP,则也能够实现像淘宝那样进入系统浏览器稍后跳转到APP。

使用WebView加载自定义的HTML文件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <script type="text/javascript">
            function showAndroidToast(toast) {
                javascript:android.showToast(toast);
            }
        </script>
    </head>
    <body>
        <input type="button" value="Say hello"
            onClick="showAndroidToast('Hello Android!')" />
        <a href="http://www.baidu.com">open http link</a>
    </body>
</html>
将HTML文件放到APP的asset目录下面,在启动后加载HTML:

    // 1.加载HTML文本
    //String htmlText = AssetUtil.getFromAssets(this, "a.html");
    //mWebView.loadData(htmlText, "text/html", "utf-8");

    // 2.加载asset中的HTML文件
    //mWebView.loadUrl("file:///android_asset/a.html");

    // 3.加载外部HTML文件
    mWebView.loadUrl("file:///sdcard/a.html");
几种方法都能够成功加载HTML文件并显示:


请忽略那个say hello按钮,点击open http link报错:

ERROR_UNKNOWN_URL_SCHEME


哪里有问题?对比淘宝,是用的系统浏览器,而我用的WebView,可能系统浏览器会额外做一些工作吧,于是使用系统浏览器加载这段HTML。

做了各种尝试:

    Intent intent=new Intent();
    intent.setAction("android.intent.action.VIEW");
    //Uri uri = Uri.parse("content://com.android.htmlfileprovider/sdcard/a.html");
    //Uri uri = Uri.parse("file:///android_asset/a.html");
    Uri uri = Uri.parse("file:///sdcard/a.html");
    //Uri uri = Uri.parse("http://www.qq.com");
    intent.setData(uri);
    intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");

其中,第三种方法是可行的:把HTML文件拷贝到外部存储,并使用外部存储文件的URL传递给浏览器。

第一种方式原因未知。

第二种使用asset,查找资料得知:要调起的APP是系统浏览器,而加载的文件却在我们自己的内部存储中,系统浏览器是无法读取文件的,囧。

第四种直接加URL显然可以,然并卵。

最后一行代码有可能无效,如果无效报manifest中未定义BrowserActivity的话则替换为下面代码:

intent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));


使用系统浏览器打开外部存储的HTML文件后,效果与自定义WebView的显示效果相同,并且点击链接后,能够跳转到我们想要的Activity。


当然,如果我们的H5界面上线了,就不用加载我们自己的HTML文件了。


总结:

点击外部URL跳转到自己的APP界面是可行的。

需要在manifest文件中对目标Activity添加拦截指定的scheme的配置。

web端要做的:与APP定跳转Activity的私有协议,在页面中直接触发此条私有协议,来达到淘宝的效果。

APP端需要做的工作还有:接收web端传来的参数进行处理。

系统默认浏览器无法加载APP内部HTML文件。

自定义WebView和系统浏览器还是有区别的,系统浏览器会根据scheme触发可以响应的安卓组件。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值