在很多应用的web站,其实都有这样一个功能,就是直接在网页中打开应用,接下来的就来探讨一下这个功能的实现,有些地方也我还没弄明白,还请懂的大神指点。

  首先,得说一点不好消息,在微信中,这样的方式是行不通的,因为微信把这种Intent(这个功能本身也就是一个Intent)给干掉了;

  首先来看一段代码:

            <intent-filter>
<action android:name="android.intent.action.VIEW" /> <data android:scheme="test.target" />
<data android:host="my.com" />
<data android:port=":6060" />
<data android:path="/hello0" />
<data android:pathPrefix="/hello"/> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>

这段代码的意思也就是说,在系统中注册了一个Intent,这个Intent能干什么呢?有什么功能呢?

  • action:表示这个Intent是可以从一个View中打开;
  • data:配置Intent所能够接收的Data(Uri),如上面的scheme,host,port,path等等;
  • category:配置Intent是可浏览的,我理解就是可以被浏览器唤起的;

这段代码很明显就是要放在被打开的应用的某一个Activity里面的;
通过这段代码分析,我们可以得出带有这样一个Uri(scheme:test.target;host:my.com;port:6060;path:hello0和path为hello开头的链接)的Intent;
而我们的html页面就需要这样一个指向上面的Uri的链接:

<a href="test.target://my.com:6060/hello">打开应用</a>

<a href="test.target://my.com:8480/hellox/22">打开应用</a>

上面那个链接,正好匹配在系统中配置的Uri,而下面的那个链接,我在测试的时候发现也能打开应用,而实际上下面的链接的port和系统配置的不一样,这是我还没搞明白的地方!求大家的指点

  其实到这里,我们还应该想到的是,能在应用中获取这个链接的一些参数或者属性吗?答案是肯定的,我拿了下一条链接来做一个简单的测试分析

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Uri data = getIntent().getData();
if (data != null) {
String scheme = data.getScheme(); // test.target
String host = data.getHost(); // my.com
int port = data.getPort(); // 8480
String path = data.getPath(); // hellox/22
List<String> params = data.getPathSegments(); // params0:hellox;params1:22
}
}

最后,来分析一下原理:

  在androidManifest.xml中定义intent-filter的时候定义的scheme,host,port,path这些东西拼凑起来其实就是一个有用的类HTTP路径;

  当在webview或者是浏览器中,尝试打开一个链接“test.target://li.com:8480/hellox/22”,如同打开http://www.xx.com是一样的,浏览器或者webview先看能否处理当前需要处理的这个uri,但是浏览器发现test.target这个schema它是处理不了的,所以就将这个链接请求发送到系统中,然后由系统搜索是否有intent-filter能够处理这个uri,如果有一个这样的intent-filter,则直接打开;如果存在多个,则会弹出一个选择界面让用户选择(如同打开一个pdf文档,如果手机中有多个pdf的阅读器,会让用户进行选择);

灵活应用:如果手机中没有这个应用,就下载此应用

  在实际项目中的scheme最好定义成http,这样如果手机中没有这个应用,还可以由浏览器打开这样一个页面,要实现这个扩展功能,其实只需要定义一个页面,浏览器请求这个页面的时候直接下载应用,然后把这个页面的http地址进行分割然后配置到对应的intent-filter的各个节点中即可;

  

其它参考:stackoverflow

Android 通过浏览器打开应用的更多相关文章

  1. Android调用浏览器打开网址遇到的问题

    我自己的手机(一加一代,升级了氢OS),然后在点击游戏内一个"隐私政策"-- 需要打开一个网页,然后就crash了.出错的信息如下: 完全是看不出来,然后我单独写了一个demo来测 ...

  2. Android通过浏览器打开app页面并且传递值

    最近公司有个需求,要求从第三方网页端打开一个网页,然后在网页中点击“下载”,“打开”按钮,在app端进行下载和打开操作.这里记录下方法. 首先,网页和app页面进行交互,其实会很快想到JS交互,但是现 ...

  3. 调用Android自带浏览器打开网页

    转载请注明出处: http://blog.csdn.net/lowprofile_coding/article/details/77928608 在Android中可以调用自带的浏览器,或者指定一个浏 ...

  4. Android/IOS 微信及浏览器(h5)中唤起本地APP,唤起浮层,然后用外部浏览器打开唤起某本地APP

    1 前言 微信点击链接,点击唤起某APP,在微信点开,默认是微信浏览器,点击button唤起,则会先提示浮层,然后用外部浏览器打开即可. 作为记录使用. 2 代码 相关源码如下: html: < ...

  5. Android 如何通过浏览器打开App

    首先给出参考资料http://my.oschina.net/liucundong/blog/354029?p=3#rpl_291191828 通过浏览器直接打开Android应用程序 Android ...

  6. cocos2d-x调用android内嵌浏览器打开网页

    cocos2d-x调用android内嵌浏览器打开网页,能够从入口传入网址,C++调用android 的api就可以实现. 方法也非常easy 1. 改动"cocos2dx\platform ...

  7. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  8. Android调用默认浏览器打开指定Url

    业务员有需求要将一个wap站在手机上以App的形式打开,还不要嵌套WebView,只能以浏览器打开.查了点资料,就有了下面这货. package com.gzz.whyinzi; import and ...

  9. Android网页浏览器的开发

    Android网页浏览器的核心Widget是包含了WebKit的WebView. 首先,布局文件activity_main.xml: <LinearLayout xmlns:android=&q ...

随机推荐

  1. 有关Laravel 4 的 Homestead 安装部署的细节

    对于Vagrant,我是相见恨晚的.有时候抽出几个小时的时间学会一种工具,对于将来可以节省几十甚至几百小时的时间. Vagant最大的好处就是节省了安装配置运行环境的时间,统一开发环境,同时可以最大限 ...

  2. RDS for MySQL有哪些限制

    原文来自:https://help.aliyun.com/knowledge_detail/41834.html 1.不支持在命令行创建数据库和数据库账号.只支持在RDS管理控制台操作. 2.不支持M ...

  3. php-laravel中间件使用

    中间件使用 1.项目目录下cmd中php artisan make:middleware adminLogin,创建中间件 2.注册中间件(\Http\kernel.php) protected $r ...

  4. Spark优化一则 - 减少Shuffle

    Spark优化一则 - 减少Shuffle 看了Spark Summit 2014的A Deeper Understanding of Spark Internals,视频(要***)详细讲解了Spa ...

  5. DataGridView滚动慢​的解决方法

    当DataGridView达到一定大小的时候,拖动滚动条就会非常慢,出现让人难以忍受的闪动. 即便只有100行,每行30列. 解决方法是启用DataGridView的双缓冲. 1 2 3 4 5 6 ...

  6. 第七章移动互联网与移动IP

    第七章移动互联网与移动IP 本章延续前几章节,对该章节内容进行归纳总结. 文章中的Why表示产生的背景,也就是说为什么会产生该技术,What表示该技术是什么,How表示该技术是如何使用的.以下将用字母 ...

  7. Linux 安装FastDFS<准备>(使用Mac远程访问)

    阅读本文需要一定的Linux基础 一 FastDFS简介 fastdfs是用c语言编写的一款开源分布式文件系统, fastdfs为互联网量身定制, 充分考虑了冗余备份, 负载均衡, 线性扩容等机制, ...

  8. 使用IntelRealScene设备结合Cocos引擎实现体感游戏开发

    英特尔开发人员专区原文地址 Cocos游戏开发引擎对于广大开发者来说都比较熟悉,Intel RealScene是什么呢,简单理解是一种特殊的摄像头,可以捕捉用户的手势,面部表情等,进而实现AR,VR的 ...

  9. Phaser游戏框架与HTML Dom元素之间的通信交互

    本想按照PHASER的HTML Dom元素官方实例:http://labs.phaser.io/index.html?dir=game%20objects/dom%20element/&q=  ...

  10. 各web服务器的特点和优势

    1.Tomcat 和 Jetty 面向java语言 天生就是重量级的web服务器.性能一般 2.IIS 只能在windows平台运行,windows作为服务器在稳定性与其他一些性能上不如类unix操作 ...