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

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

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

选择手机淘宝做研究。

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

点击APP外部链接唤醒APP的研究_第1张图片

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

点击APP外部链接唤醒APP的研究_第2张图片

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


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

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

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


差异:

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

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

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

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

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


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

        
            
                
                
                
                
            
        


然后自己写Demo程序。

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

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



    
        
        
    
    
        
        open http link
    
将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触发可以响应的安卓组件。


你可能感兴趣的:(android)