在很多应用的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. 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  2. Python闭包相关问题

    闭包的概念一直是似懂非懂,看过了原理,却不知道怎么实际应用. 刚好看到Python的late binding问题,记录如下,以备后续增补. >>> def create_multip ...

  3. python-前方高能-面向对象-进阶3

    面向对象 你写代码的时候 什么时候用面向对象 代码量大,功能多的时候 处理比较复杂的角色之间的关系 qq 好友 陌生人 群 组 复杂的电商程序 公司/学校的人事管理/功能的系统 我的代码的清晰度更高了 ...

  4. My status

    I haven‘t any one who is strong relationship with me. My skill is normal. I'm not interesting in neg ...

  5. power sequece

  6. Pycharm主菜单学习

    “工欲善其事,必先利其器”,这话我一直是这么坚信的! 找到一款顺手称心的工具,拥有它,熟练地使用它! Pycharm据说就是使用Python的一款最好的工具—— 于是,开始了第一步的学习----先从熟 ...

  7. phpcms v9手机站不支持组图($pictureurls)的修改

    phpcms v9自带的手机门户网站,有时候我们需要用到组图功能$pictureurls,我在做的时候发现,如果$pictureurls中只有一张图片会正常显示,但是如果有两张或两张以上的图片的时候, ...

  8. leetcode12_C++整数转罗马数字

    小弟不才,有错误或者更好解,求留言. 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, ...

  9. Fast R-CNN学习总结

    Fast R-CNN是R-CNN的改良版,同时也吸取了SPP-net中的方法.在此做一下总结. 论文中讲到在训练阶段,训练一个深度目标检测网络(VGG16),训练速度要比R-CNN快9倍左右,比SPP ...

  10. 使用SKlearn(Sci-Kit Learn)进行SVR模型学习

    今天了解到sklearn这个库,简直太酷炫,一行代码完成机器学习. 贴一个自动生成数据,SVR进行数据拟合的代码,附带网格搜索(GridSearch, 帮助你选择合适的参数)以及模型保存.读取以及结果 ...