转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/123238777
本文出自【赵彦军的博客】

文章目录

  • 浏览器为什么能唤起App的页面
  • URI、URL
  • 二、URL的组成
  • Scheme
  • 注意点
  • 举例
  • encode
  • h5如何通过scheme唤起app
  • 通过另一个APP打开
  • 编码、解码

浏览器为什么能唤起App的页面

浏览器为什么能唤起App的页面

URI、URL

  • URI=Uniform Resource Identifier:统一资源标志符,在某一个规则下能把一个资源独一无二的标识出来。比如你的身份证号。
  • URL=Uniform Resource Locator :统一资源定位符,可以提供找到该资源的路径,是URI的子集,是用定位方式实现的URI。

在www上,每一个信息资源都有统一的且在网上唯一的地址,该地址就叫URL,就是指网络地址。

二、URL的组成

URL的一般语法格式为(带方括号[]的为可选项)

protocol://hostname[:port]/path/[;parameters][?query]#fragment
协议://域名:端口号/目录/文件名.文件后缀?参数=值#标志https://www.testurl.com:8080/path/subpath;parms=test_parms?uid=123&gid=45#fragment=009&fragment
  • protocol 协议,常用的协议是http
  • hostname 主机地址,可以是域名,也可以是IP地址
  • port 端口 http协议默认端口是:80端口,如果不写默认就是:80端口
  • path 路径 网络资源在服务器中的指定路径
  • parameter 参数 如果要向服务器传入参数,在这部分输入
  • query 查询字符串 如果需要从服务器那里查询内容,在这里编辑
  • fragment 片段 网页中可能会分为不同的片段,如果想访问网页后直接到达指定位置,可以在这部分设置

Scheme

英文含义:方案、格式、策略

就是自定义的protocol,非标准,在许多情况下,scheme就是protocol的名称,定义了如何获取资源。

注意点

  • 编码,query要编码,否则使用系统方法直接解析会失败

举例

val url = "taobao://app/path?version=1.0&name=zhaoyanjun&open=true"
val uri = Uri.parse(url)
val scheme = uri.scheme
val host = uri.host
val path = uri.path
val version = uri.getQueryParameter("version")
val name = uri.getQueryParameter("name")
val open = uri.getBooleanQueryParameter("open", false)Log.d("yu--", "scheme:$scheme")
Log.d("yu--", "host:$host")
Log.d("yu--", "path:$path")
Log.d("yu--", "version:$version name:$name")
Log.d("yu--", "open:$open")

日志:

D/yu--: scheme:taobao
D/yu--: host:app
D/yu--: path:/path
D/yu--: version:1.0 name:zhaoyanjun
D/yu--: open:true

encode

在线 encode: http://www.jsons.cn/urlencode/

query要编码,否则使用系统方法直接解析会失败。

为什么要编码,举个例子,我有两个参数:

  • 参数1:h5=https://baidu.com/step?_bid=11&version=1
  • 参数2:version=1234

完整的 scheme 如下:

taobao://app/path?h5=https://baidu.com/step?_bid=11&version=1&&version=1234

下面获取分别获取参数 h5、version

val h5 = uri.getQueryParameter("h5")
val version = uri.getQueryParameter("version")结果:
h5:https://baidu.com/step?_bid=11
version:1

显然获取的值,不是我们想要的正确的值,下面我们将 整个 query 参数编码,在看看效果。编码后的 scheme 如下:

参数一编码前:https://baidu.com/step?_bid=11&version=1参数一编码后:https%3A%2F%2Fbaidu.com%2Fstep%3F_bid%3D11%26version%3D1参数二编码前:1234
参数二编码后:1234

把两个参数组合起来,完整的 scheme 如下:

taobao://app/path?h5=https%3A%2F%2Fbaidu.com%2Fstep%3F_bid%3D11%26version%3D1&version=1234

后去相关参数如下:

D/yu--: scheme:taobao
D/yu--: host:app
D/yu--: path:/path
D/yu--: h5:https://baidu.com/step?_bid=11&version=1
D/yu--: version:1234

h5如何通过scheme唤起app

在 Activity 里添加 scheme 值

     <activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><!-- scheme 开始 --><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><category android:name="android.intent.category.APP_BROWSER" /><dataandroid:host="app"android:path="/path"android:scheme="taobao" /></intent-filter><!-- scheme 结束 --></activity>

WEB 端通过调用 taobao://app/path?query1=1&query2=true 便能打开这个Activity。其中 schemehost 是必须的,另外的看需求。

通过WEB端打开

<!DOCTYPE html>
<html>
<head><title>test</title>
</head>
<body><a href="taobao://app/path?query1=1&query2=true">打开APP</a>
</body>
<html>

核心就是一段 Schema 协议的 URL,scheme、host 是打开APP页面所必须的。传递的参数都可以在APP页面中获取到。

通过另一个APP打开

val intent = Intent(Intent.ACTION_VIEW,Uri.parse("taobao://app/path?query1=1&query2=true"))
startActivity(intent)

获取 scheme 值

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val uri = intent.dataif (uri != null) {val scheme = uri.schemeval host = uri.hostval path = uri.pathval query1 = uri.getQueryParameter("query1")val query2 = uri.getQueryParameter("query2")Log.d("yu--", "scheme:$scheme")Log.d("yu--", "host:$host")Log.d("yu--", "path:$path")Log.d("yu--", "query1:$query1")Log.d("yu--", "query2:$query2")}}}

编码、解码

  • 字符串编码、解码
    /*** 编码*/private fun encode(url: String): String {return URLEncoder.encode(url, "UTF-8")}/*** 解码*/private fun decode(url: String): String {return URLDecoder.decode(url, "UTF-8")}
  • scheme 解码
   /*** 获取解码后的参数*/private fun getDecodeParams(uri: Uri, key: String): String? {runCatching {return URLDecoder.decode(getParams(uri, key), "UTF-8")}return null}/*** 获取参数*/private fun getParams(uri: Uri, key: String): String? {runCatching {return uri.getQueryParameter(key)}return null}

Android通过Scheme协议打开APP界面相关推荐

  1. Url scheme 方式 打开App Store和应用商店

    Url scheme 方式 打开App Store和应用商店 iOS打开方式 itms-apps://itunes.apple.com/app/id应用ID 例子:微信的应用ID 为 41447812 ...

  2. iOS和Android手机浏览器链接打开app store或应用市场下载软件

    iOS和Android手机浏览器链接打开app store或应用市场下载软件 1.Android主流手机跳转链接 // androidId 如:com.xxx.app// oppo oppomarke ...

  3. Android 中Scheme协议的使用详解唤起Activity或App

    1. 什么是URL Scheme? 是一种页面内跳转协议:通过定义自己的scheme协议,可以非常方便跳转app中的各个页面. 2.什么时候使用 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相 ...

  4. android scheme打开app,android 通过Scheme链接启动app

    一.参考文章: http://www..com/shadajin/p/5724117.html http://jingyan.baidu.com/article/c45ad29cd6b15505175 ...

  5. android应用宝地址链接,android 通过Scheme链接启动app

    一.参考文章: http://www.cnblogs.com/shadajin/p/5724117.html http://jingyan.baidu.com/article/c45ad29cd6b1 ...

  6. 小程序和android联调,小程序打开APP指定页面

    小程序打开APP指定页面 一.小程序端准备 1.最好将小程序基础调试库调整至较为新的版本.(我选择的是大于2.5.1的版本) 2.从官网把代码 copy 过来,记得看看 button 的小程序打开ap ...

  7. android ui头像圆角化,APP界面设计当中,为什么喜欢把头像设计成圆形

    看到这样的标题,你是不是也很惊奇呢?仔细的去回想一下,好像很多APP界面设计当中的头像都是圆形的.很少见到头像是方形的.菱形或者四边形的. 这是为什么呢? 难道是因为好看吗? 今天25学堂的小编跟大家 ...

  8. iOS和Android手机浏览器链接打开app store或应用市场下载软件讲解

    引言 当开发一个app出来后,通过分享引流用户去打开/下载该app软件,不同手机下载的地方不一样,比如:ios需要到苹果商店去下载,Android手机需要到各个不同的应用商店去下载(华为手机需要到华为 ...

  9. android好看的配色方案,APP界面常用的五种颜色搭配

    众所周知,每一种颜色带给用户的视觉感受也是不同的.现在人们对手机的依赖程度,就能看到手机中APP的发展前景,那今天就跟大家聊聊如何通过颜色搭配的不同来进行移动端APP界面的布局和排版设计. 移动端UI ...

最新文章

  1. oracle--with as
  2. [JLOI2011]飞行路线
  3. 算法导论之图的基本算法
  4. 四,Golang 交叉编译
  5. c 语言读取注册表信息,C++读取注册表的实现方法
  6. vue.js 安装
  7. Azure上部署FTP服务
  8. tbytes 转 十六进制 string
  9. 通过释放cache内存解决ubuntu死机问题
  10. Mimics:修改像素单位
  11. django下载文件异常 - ValueError: read of closed file
  12. 分区助手扩大c盘后自动修复_分区助手扩大c盘的详细操作步骤
  13. 再见北理工:忆北京研究生的编程时光
  14. 「网络安全」将会是下一个风口?这个“下饭神剧”值得一看!
  15. 采用numpy快速将两个矩阵或数组合并成一个数组和行列转置
  16. SEO搜索引擎优化步骤建议
  17. AI challenger 2018图片分类比赛—农作物病害检测
  18. 云计算期末习题含答案
  19. springboot 启动项目报Consider defining a bean of type 'com.mooc.house.biz.service.XXX' in your config
  20. Java操作Json数组

热门文章

  1. maya中英文切换插件_老司机都在用的30款maya常用插件
  2. 线性代数中的矩阵消元法,求逆
  3. 十三、手把手带你搭建Clouders Manager
  4. 物理化学 化学 动力学(上)
  5. C/C++Linux服务器开发/高级架构师
  6. 除了TensorFlow、PyTorch,还有哪些深度学习框架值得期待?
  7. 基于深度学习的多目标跟踪算法——ReID与MOT的联系
  8. 飞桨PaddlePaddle送算力 | 每日登录即送12小时,连续5天还有加送!
  9. PaddlePaddle版Flappy-Bird—使用DQN算法实现游戏智能
  10. python的for循环语句怎么写_python中的for循环语句怎么写