我们经常看到当点击一个链接的时候,跳转到app,比如当我们在网页端浏览新闻的时候,要想查看更多评论等就会提示你跳转到app内打开查看,那是如何实现网页中打开app的呢?

怎么实现?


要想实现浏览器内打开app,其实我们可以看做就是打开一个链接,只是我们普通的链接都是http或者https开头的,如果要想打开app,那我么需要自定义这个schem。

首先我们来学下下uri的组成吧

scheme://host:port/path?qureyParameter=queryString

一个uri是由上面几个部分组成的,分别是:

https://www.baidu.com/images?keyword=花儿
  1. scheme: scheme就是上面例子中的https
  2. host: 在url中就是我们的域名或者ip地址(包含端口)
  3. path: 主机资源的具体地址。如目录和文件名
  4. params: 传递的参数

第一步:在AndroidManifest.xml中注册

html中代码很简单,就这么一行,是不是html写好了就可以打开app了呢?当然不可以,我们需要在我们的app中注册这个uri。现在来到app中,我们在AndroidManifest.xml中加入,我们在MainActivity中注册。注册代码如下:

<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"/>//这里myapp一定要和html中scheme一致。<data android:scheme="myapp"/></intent-filter></activity>

第二步:在网页中定义一个uri

所以我们可以给我们的app定义一个uri,html中代码如下:

    <a href = 'myapp://wms.com/openwith?name=wms1993&age=24'> 打开app </a>

当我们通过浏览器打开链接的时候,就会自动打开我们的app了,不同浏览器可能提示不一样,我用uc浏览器打开就会提示如下:

注意:这里不能直接在浏览器地址栏中直接输入我们的url,这样的话浏览器默认会给我们的url加上http,那么就无法打开应用了,最好是嵌在网页中。

怎么传值

经过上面两个步骤,我们就可以简单实现通过浏览器打开app了。现在我们要讲的是怎么给我们的应用传值呢?我们知道,在http传输的时候,有get请求和post请求,当然这种情况下我们只能通过get请求的方式传值,get方式传值就是把值放在url的后面,如上面例子中,我们传递了两个值

  1. name = wms1993
  2. age = 24

对于网页中我们和普通的http没啥区别,现在关键在我们app端,该怎么接收值呢?看下代码:

/*** create by wms1993*/
public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (getIntent().getAction().equals(Intent.ACTION_VIEW)) {//通过浏览器打开Uri uri = getIntent().getData();String name = uri.getQueryParameter("name");String age = uri.getQueryParameter("age");Log.e(TAG, "onCreate: name = " + name);Log.e(TAG, "onCreate: age = " + age);}}
}

logcat如下:

06-12 09:57:43.064 12399-12399/bluetooth.wms.com.openappbybrowser E/MainActivity: onCreate: name = wms1993
06-12 09:57:43.065 12399-12399/bluetooth.wms.com.openappbybrowser E/MainActivity: onCreate: age = 24

当我们打开app的时候,会调用onCreate方法,这里我们看看getIntent的Action是不是ACTION_VIEW,如果是那么是从浏览器中打开的。

一些问题

经过上面的步骤,我们实现了浏览器打开app以及给app传值的操作,那么是不是就这样结束了呢?当然不是,这里面还有一些小问题,加入我们app是一个新闻类的app,当我们通过网页浏览新闻的时候,然后点击了新闻详情,里面有一个提示在app内查看的时候,这种情况会有如下问题:

  1. 当我们新闻app是已经打开的时候,我们从浏览器过来,当按下返回键的时候,是否能回到之前打开的界面?
  2. 当我们的新闻app没有打开时,我们从浏览器过来,当按下返回键的时候,我们想回到新闻首页而不是回到上一个应用程序,我们该怎么做?

先来看下默认情况下是Android是如何操作的,我们现在通过浏览器打开app(app之前没打开),这时候我们按下Home键,然后进入,这时候会发生什么事?现在MainActivity.java中onCreate方法加上打印。当我们通过浏览器打开app,日志如下:

06-12 10:17:07.738 16021-16021/bluetooth.wms.com.openappbybrowser E/MainActivity: onCreate...
06-12 10:17:07.738 16021-16021/bluetooth.wms.com.openappbybrowser E/MainActivity: onCreate: name = wms1993
06-12 10:17:07.738 16021-16021/bluetooth.wms.com.openappbybrowser E/MainActivity: onCreate: age = 24

当按下Home键返回桌面的时候,我们在点击桌面图标打开app,这时候日志如下:

06-12 10:17:59.518 16021-16021/bluetooth.wms.com.openappbybrowser E/MainActivity: onCreate...

通过日志可以看出,这时候应用重新创建了。
默认情况下,浏览器唤起的页面按返回键是回不到之前打开的界面的,那么这是为啥呢?

首先大家应该了解下启动模式,我以前博客中有一篇关于启动模式的文章,Activity 启动模式 ,下面我们简单介绍下任务栈的概念。默认情况下,如果没有对 Activity 设置 TaskAffinity 属性,一个应用的所有 Activity 都是运行在同一个任务栈的,任务栈的名称为应用的 PackageName。如果从应用A启动应用B的某个 Activity C,则 C 会运行在 A 的任务栈中。说到这里,相信大家应该明白为啥了吧。

当我们从Launcher启动app时,app运行在Launcher的任务栈中,从浏览器中打开app则运行在浏览器任务栈中,那如何解决这个问题呢?

由于从桌面点击应用会创建自己的应用栈,那么如果我们可以把浏览器任务栈中的界面移动到应用本身的任务栈中。那么怎么将 Activity 从其他任务栈中移到自己的任务栈中呢?方法很简单,只需要在相应的 Activity 中配置 allowTaskReparenting 属性 为 true 即可。但是有时候我们可能不光要将一个 Activity 移过来,有时候我们需要将整个应用移动过来,这时候我们可以将allowTaskReparenting 添加到application 上,代码如下:

<application
        android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"//如果想将整个应用都移动到则在这里添加android:allowTaskReparenting="true"android:theme="@style/AppTheme"><activity
          //如果只想移动某个Activity到则在这里添加android:allowTaskReparenting="true"android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-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:scheme="myapp"/></intent-filter></activity><activity android:name=".PageDetailActivity"/>
</application>

这样这个问题就解决了。

Android 实现浏览器打开app相关推荐

  1. Android通过浏览器打开App并传递参数

    Android通过浏览器打开App并传递参数; Data的Uri的规则: scheme://host:port/path or pathPrefix or pathPattern 打开App传递参数U ...

  2. 2分钟学会android通过浏览器打开app

    概述 我们的项目通常会有一个m版,即从手机浏览器查看网站看到的,我们更希望用户从m版跳到我们的app观看操作.这时候,我们会在右下角添加一个,跳转app的按钮. 实现 功能的实现,要求负责h5的同学在 ...

  3. android 使用浏览器打开指定页面

    今天,简单讲讲android里如何使用浏览器打开指定的网页. 之前,我做一个功能时,服务器返回一个url地址,我需要跳转到指定网页.却发现自己不知道怎么做,在网上搜索了资料,最终是解决了问题.这里记录 ...

  4. IOS 如何通过浏览器打开App

    前言: 随着App的开发,花样也越来越多了.现如今,是一个商家猖獗的时代,处处都是他们投放的广告.广泛的推广他们的产品或者服务,他们就在网上投放大量的网页,其中网页里面有一些特殊或者炫彩的按钮,或者文 ...

  5. ios html自动进入app,iOS 通过浏览器打开app

    1.Targets --> Info --> URL Types --> URL Schemes(填写自定义协议,如:watson),如图: 步骤1.png 2.Html代码 IOS ...

  6. android 短信打开APP功能及注意事项

    android 短信打开APP 1.FirstActivity配置intent-filter 2.H5提供重定向 3.Activity解析参数 4.APP退到后台无法跳转问题解决 项目APP使用的是D ...

  7. android自动浏览网站,android 使用浏览器打开指定页面的实现方法

    之前,我做一个功能时,服务器返回一个url地址,我需要跳转到指定网页.却发现自己不知道怎么做,在网上搜索了资料,最终是解决了问题.这里记录一下. 启动android默认浏览器 在Android程序中我 ...

  8. Android中一个app启动另一个app|从浏览器打开app

    文章目录 一.应用A中点击按钮,跳转到应用B 二.应用A中点击按钮,跳转到应用B中的指定Activity--(scheme方式) 1.应用A中,点击按钮 2.应用B中,AndroidManifest. ...

  9. android 短信打开APP

    需求说明:用户收到短信,点击短信链接 打开APP,有直接打开,没有下载APP 功能分析:首先写一个H5界面,界面内容有两个按钮,一个下载,一个打开,没有点击下载去安装,有直接打开APP,然后在Andr ...

最新文章

  1. 小米资深工程师瞿晋萍(男):米聊服务器的技术选型和架构设计
  2. 诺奖得主克鲁格曼:比特币是庞氏骗局,但不一定很快走向崩溃
  3. asp.net core 教程(七)-异常处理、静态文件
  4. 持续交付流水线的敏捷利器:环境配置管理与应用部署自动化
  5. python安装包_在python官网打不开的情况下获取获取官方最新安装包
  6. Electron中与Vue集成流程
  7. 首发:李航老师的《统计学习方法》第二版的代码实现(Github标星过万!)
  8. 一张图告诉你为什么是服务网关
  9. apache 验证 php 安装,PHP的安装以及验证Apache
  10. 阿里取消周报!但普通数据人的周报、月报焦虑,谁来拯救?
  11. [CTSC1999] 家园
  12. OpenGL南邮计算机图形学实验报告二——两个纹理的渐变变换和移动
  13. 腾讯AI Lab与北京协和医院联合发布国产手术导航系统
  14. 录音棚的基本搭建//2021-1-31
  15. 农业计算机应用论文,计算机应用论文农业中计算机应用科技模式
  16. 银河麒麟桌面操作系统V10常见问题解决方法
  17. April.12.2022——折纸问题(微软面试题)
  18. 工业相机镜头选型案例分析
  19. 2022第六季完美童模 广元赛区 直选赛圆满落幕
  20. 常用知识总结(二) 之 电容谐振频率点和阻抗

热门文章

  1. 初识C语言————3
  2. 解决 zbrush导出的模型在blender里没有颜色的问题
  3. Nginx证书配置:tomcat证书jks文件转nginx证书.cet和key文件
  4. 去掉Excel 单元格里的字符后面的空格
  5. 如何快速开设海外银行账户
  6. C#可以编辑的ListView
  7. Android图像适配
  8. [归并排序]leetcode327:区间和的个数(hard)
  9. 一个实际电路的原理图是怎样设计出来的?
  10. Altium Designer 19简易教程(原理图的绘制)