0x00

有时候你会发现,用Android系统自带的浏览器(chrome)打开一个web页面,如果安装了相应的App,就会自动打开这个App并进入具体的界面中,比如手机上打开:

https://www.zhihu.com/openinapp_instruction?app-id=432274380&app-argument=zhihu://questions/24122524

如果我们安装了知乎手机客户端,这个时候会自动打开知乎手机客户端,并且进入问题展示界面。还比如网易云音乐,今日头条等等App都是支持这个功能的。之前我们自家App的分享都是打开一个App介绍的界面,即使安装了手机客户端,也不会自动打开手机客户端。为了追求更好的体验,我们需要实现这个功能。

0x01 Chrome浏览器

研究这个功能,还是查阅了不少资料,比如 app link、deep link、chrome browser等等,如果紧紧是实现上面介绍的功能,还是 so easy的,仅仅需要了解 Chrome 浏览器 创建 Intent 的方法即可。

Chrome构造一个 Intent 的基本语法如下:

intent:HOST/URI-path // Optional host #Intent; package=[string]; action=[string]; category=[string]; component=[string]; scheme=[string]; end; 

根据上面的语法,我们来看一个demo:

intent://article/51348656#Intent; package=com.ttdevs.android; scheme=ttdevs; end; 

可以使用下面的 html 代码触发这个事件:

<a href="intent://article/51348656/#Intent;scheme=ttdevs;package=com.ttdevs.android;end">ttdevs</a>

另外还有个参数:

S.browser_fallback_url=[encoded_full_url]

介绍如下(不过我没搞明白):

When an intent could not be resolved, or an external application could not be launched, then the user will be redirected to the fallback URL if it was given.
Some example cases where Chrome does not launch an external application are as follows:
- The intent could not be resolved, i.e., no app can handle the intent.
- JavaScript timer tried to open an application without user gesture.
Note that S. is a way to define string extras. S.browser_fallback_url was chosen for backward compatibility, but the target app won’t see browser_fallback_url value as Chrome removes it.

0x02 App内处理浏览器发来的Intent

通过上面的介绍,如果我们点击链接,就会触发一个 Intent,有了Intent,我们还需要来处理它。在 AndroidManifest.xml 中相应的 Activity 中的配置中添加如下filter:

<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="article" android:pathPattern="/.*" android:scheme="ttdevs"/>
</intent-filter>

同时在Activity中处理Intent:

public class RouterActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_router);handleIntent(getIntent());}private void handleIntent(Intent intent) {String action = intent.getAction();String data = intent.getDataString();LogUtils.debug(action);LogUtils.debug(data);}
}

运行上面的代码,同时用系统浏览器打开上面的html,点击链接,即可调起我们的app。或者也可以通过下面的adb命令触发:

adb shell am start \
-a android.intent.action.VIEW \
-c android.intent.category.BROWSABLE \
-d "ttdevs://article/12345" com.ttdevs.android

在我的设备(魅族MX4 Pro)上,如果没有安装处理这个 Intent 的App,则会打开系统自带的应用市场。

对于一个提供查询食物数据的App,如果我们分享出去的食物信息带上了相关的参数,在用户点击分享链接时,如果安装了我们的App则可以跳到App中展示食物的界面,如果没有安装,则会跳到应用市场下载,很好的逻辑~~


参考:
https://developer.chrome.com/multidevice/android/intents

从浏览器中打开我们的应用相关推荐

  1. index.php user r,安装cms :在浏览器中打开http://你的网址/install/index.php 出现白屏怎样处理?...

    上传到空间了的话,就不能用LOCALHOST了,要用你绑定这个空间的域名代替,具体的应该是http://你绑定的域名/install/index.php 由热心网友提供的答案1: 方案一: 1.打开安 ...

  2. VSCODE安装必要的插件实现浏览器中打开,以及显示网址

    1,实现在浏览器中打开: 安装:open in browser 2,实现浏览器中打开.并且附带网址: 安装插件:live server

  3. 微信阅读原文直接打开浏览器_微信打开网址添加在浏览器中打开提示

    使用 http://mp.weixin.qq.com/mp/redirect?url=http://caibaojian.com/test.apk#weixin.qq.com#wechat_redir ...

  4. js判断是否在微信浏览器中打开

    js判断是否在微信浏览器中打开 function is_weixn(){ var ua = navigator.userAgent.toLowerCase(); if(ua.match(/MicroM ...

  5. Js判断是否在微信浏览器中打开和微信版本号

    一.判断微信版本号 var wechatInfo = navigator.userAgent.match(/MicroMessenger\\/([\\d\\.]+)/i) ; if( !wechatI ...

  6. VB 在浏览器中打开指定网址

    Shell "Rundll32.exe url.dll, FileProtocolHandler http://miaozk2006.blog.163.com", vbNormal ...

  7. 浏览器中打开IOS应用并传参

    原创文章,转载请注明 开发中遇到这么一个问题,就是动态地指定联接服务器地址,或其它数据.如果是其它数据还好说一些,可以通过在服务器上获得的方式来弄.但如果服务器地址都需要动态指定的话.那就得另想办法了 ...

  8. 微信打开网址提示在浏览器中打开的办法

    使用微信打开网址时,无法在微信内打开常用下载软件,手机APP等.网上流传的各种微信打开下载链接,微信一更新基本失效.大家常用的方法是,弹出一个遮罩提示用户在新的浏览器窗口打开,再也不用管微信如何的更新 ...

  9. H5+在浏览器中打开相机扫描二维码

    刚开始提出要在手机浏览器中的HTML页面做扫描是有点懵的,一顿百度后搜到两种方法: 方案一,浏览器中打开相机navigator.mediaDevices.getUserMedia 自带浏览器不支持该属 ...

  10. 前端页面嵌入二维码,微信扫出现请点击右上角,选择在浏览器中打开的解决方法

    现在手机微信上扫码比较多,但是微信内置的浏览器相对而言会有拦截,会提醒用户 " "请点击右上角,选择"在浏览器中打开" "打开的字样,但具体怎么实现, ...

最新文章

  1. 设置同一Label内涵不同颜色字体
  2. 儿童猜词游戏图片_超实用的儿童社交游戏分享(听指令、认知、规则)
  3. 【深度学习】在PyTorch中使用 LSTM 进行新冠病例预测
  4. 图像相似度算法的C#实现及测评
  5. flight php 中文,PHP: composer的简单使用
  6. 51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))
  7. Win10 Build 11099和11102的更动超过1200项
  8. Struts 2初体验
  9. 算法学习四:算法性能分析理论基础——函数增长与渐进分析
  10. BoolToVisibilityConverter In WPF
  11. 阅历总结:运用IBM DB2数据库的详细事变
  12. 网易云linux版本下载
  13. 计算机组成原理——RAID 硬盘阵列
  14. Wowza服务器系列(1):介绍
  15. 单机:Oracle 19C 数据库一键安装
  16. OpenGL第二讲——绘制简单的几何图形
  17. 大家的人工智能——学习路线总览
  18. android中AudioRecord使用详解
  19. Squid - 403 Forbidden (SSH via HTTP Proxy)
  20. 长短期记忆网络(LSTM)学习笔记

热门文章

  1. iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码
  2. 华为颇无奈,徕卡或离它而去而与小米合作
  3. NVIDIA RTX A6000深度学习训练基准
  4. 那些不能在一起吃的水果搭配
  5. 多核cpu的缓存一致性
  6. 各大公司Java面试题超详细总结
  7. 限时5折,仅剩1天!这波羊毛我撸爆~
  8. iOS锁屏页面控制音乐播放
  9. (一)移动端前端开发-移动端基础
  10. S.M.A.R.T. 参数(smartctl)计算硬盘精确健康值