最近工作中的一个需求是点击短信链接则调起App然后完成相关功能逻辑,查阅相关文章完成需求,以此文章来记录Android中点击链接吊起App的实现。

原理

通过使用自定义Scheme方式,修改Scheme为自己的Scheme,来实现调起APP。
App通过注册intent filter声明intent,其它应用发送intent时通过系统级广播传递过来,如果与APP预先注册的intent filter匹配,App将收到该intent,实现调起App功能。

实现

自定义Scheme为:test://mytest.com/path?type=test
1.App的清单文件中添加intent-filter:

<activity
      android:name=".TestActivity"><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:host="mytest.com"android:pathPrefix="/path"android:scheme="test" /></intent-filter>
</activity>

2.在TestActivity.java的onNewIntent()/onCreate()方法中可以接收到相应的参数:

public void handleUri(Intent intent){String action = intent.getAction();Uri uri = intent.getData();if (uri != null) {String type= uri.getQueryParameter("type");}
}

其中相关API:

方法 说明 对应”test://mytest.com/path?type=test”的结果
getScheme() 获取Uri中的scheme字符串部分 test
getHost() 获取Authority中的Host字符串 mytest.com
getPath() 获取Uri中path部分 /path
getQuery() 获取Uri中的query部分 type=test
getQueryParameter(String key) 获取Uri中query中key的值 getQueryParameter(“type”)为test

这样就实现了点击链接调起App,根据相应参数进行处理完成相应需求。

注意:

1.在上述中的handleUri(Intent intent)方法中的intent对象:
(1)对于onCreate()方法通过this.getIntent()获取intent
(2)对于onNewIntent()方法则直接使用onNewIntent(Intent intent)中的intent。
在onNewIntent()方法中如果使用getIntent()获取intent对象会造成程序已经启动,点击链接地址调起App所获取到的Uri为Null。
2.关于getQueryParameter(String key)方法,如果Key中值带有”+”,使用此方获取到的值中会自动将”+”替换为空格,导致解密出错问题。
查阅相关资料,发现这是google api的bug。
网上有的说通过UrlQuerySanitizer.getParameterList()替代getQueryParameter方法,但亲测发现此方法得到的key的值会自动将”+”替换为”_”。
所以,无解,最终采取了最古老的截取字符串的方法。
如果大家有好的方法,欢迎讨论。
关于此问题参考文档:
https://blog.jamespan.me/2015/05/17/url-encoding
https://stackoverflow.com/questions/18281593/uri-getqueryparameter-not-working-with-and-symbols
参考文档:
http://blog.csdn.net/books1958/article/details/49948555
http://www.jianshu.com/p/58b9245a6f16

Android中点击链接调起App相关推荐

  1. ios开发跳转safari_阻止iOS Web APP中点击链接跳转到Safari 浏览器新标签页

    最近为了更好地接触移动Web 开发狠心购买了一台ipad mini(之前一直都是借同学的,借多了就不好意思了).拿来调试DeveMobile 与EaseMobile 主题 时候发现了不少问题,现在在一 ...

  2. Android中点击事件的四种写法

    Android中点击事件的四种写法 使用内部类实现点击事件 使用匿名内部类实现点击事件 让MainActivity实现View.OnClickListener接口 通过布局文件中控件的属性 第一种方法 ...

  3. 解密-大象跳转如何实现微信中点击链接直接跳到默认浏览器(不是在微信内置浏览器打开)

    很多朋友不知道如何实现微信中点击链接直接跳到默认浏览器的功能是如何实现,经常能在各大论坛看到这样的提问,故特写了这篇文章分享一下之前在网上看到的一个在线使用该功能的平台的操作方法. 大象跳转在线操作步 ...

  4. android中点击空白处隐藏软键盘

    在android中点击EditText的时候会弹出软键盘,这时候如果想隐藏软键盘或者填完内容后点其他的地方直接隐藏软键盘,可以按一下方法处理. 首先获得软键盘Manager InputMethodMa ...

  5. [乐意黎原创] 删除QQ的MiniBrowser浏览器,QQ聊天会话中点击链接直接用默认浏览器中打开

    [乐意黎原创] 删除QQ自带的MiniBrowser浏览器,使从聊天会话中点击链接直接打开默认浏览器中打开 如题,不知从什么版本开始,乐-意-黎无意中发现,点击QQ聊天会计中的链接时,不会在默认浏览器 ...

  6. 【邮件邮箱】点击链接调起微信跳转到公众号、添加好友如何实现?

    大家在营销引流时希望发送邮件给用户,收到邮件后对方点击链接 调起微信 跳转到公众号.添加好友页面达到很好的转化效果:我们使用如下方法达到目的,我们先看下效果. 一.外链创建方法 1.薇搜索天天外链(公 ...

  7. gdtool解决在微信中点击棋牌游戏类app下载链接显示已停止访问打不开的问题

    前言 现如今微信对第三方推广链接的审核是越来越严格了,域名在微信中分享转发经常会被拦截,一旦被拦截用户就只能复制链接手动打开浏览器粘贴才能访问,要不然就是换个域名再推,周而复始.无论是哪一种情况都会面 ...

  8. 微信内浏览器不支持下载APK文件的解决方案 微信中点击链接调用外部浏览器打开

    需求:在微信h5页面中下载第三方app -- 安卓, 直接下载apk文件包:iphone,跳转AppStore 分析:微信不支持,在微信中屏蔽了apk文件的下载以及AppStore的跳转(且除非和TX ...

  9. 浏览器点击链接打开指定APP详解

    Android业务组件化之URL Scheme使用 什么是 URL Scheme? android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常 ...

最新文章

  1. JavaMail学习笔记(一)、理解邮件传输协议(SMTP、POP3、IMAP、MIME)
  2. python模块之datetime
  3. python绘制动态模拟图-用python生成地球运动的动态模拟动态图
  4. C++——《算法分析》实验伍——箱子装载问题
  5. button执行onclick函数_千万别再一直无脑使用ES6的箭头函数了,它虽然很有用但并不是万能的...
  6. sap甲方_带你走进SAP项目实施过程——前言
  7. 一个老程序员对数据库的一点纠结
  8. web元件库、axure元件库、通用元件库、常用web组件、常用表单、框架、数据表单、导航栏、边框、图标、列表、日期时间选择器、评分组件、穿梭框、输入框、步骤条、图表组件、数据可视化、后台模板、时间轴
  9. 腾讯地图api修改信息窗口样式_ThingJS通过地图的信息窗口展示常见数据
  10. Hive 整合 HBase
  11. LVS+Heartbeat+Ldirectord
  12. 2018-2019-1 20165203 《信息安全系统设计基础》第十一周学习总结
  13. python pandas安装不了_python安装pandas问题!python pandas安装教程
  14. 【稀饭】react native 实战系列教程之项目初始化
  15. 动作识别-Regularization on Spatio-Temporally Smoothed Feature for Action Recognition-CVPR2020
  16. 不到一周我开发出了属于自己的知识共享平台
  17. 电子邮件链接格式html主题,html创建电子邮件链接的方法
  18. Elasticsearch中object类型与nested类型之间的区别
  19. 51单片机——人体红外感应报警
  20. O-1 4GB+的ISO镜像刻录

热门文章

  1. GC日志中sys时间比user时间长该如何处理?
  2. 刘彬20000词汇05
  3. 音乐手记之民谣一:Empyrium
  4. Redis缓存详解(黑马-未完结)
  5. 晒一晒程序员桌面,你惊呆了没?
  6. 密码学实验_7_S盒创建(python 实现)
  7. 2005-11-11
  8. 计算机其他图标删除,我的电脑其他图标删除方法介绍
  9. 看看你去苹果公司的话能挣多少钱
  10. 【Unity】Obi插件系列(三)—— Collisions