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

怎么实现?

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

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

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

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

https://www.baidu.com/images?keyword=花儿

scheme: scheme就是上面例子中的https

host: 在url中就是我们的域名或者ip地址(包含端口)

path: 主机资源的具体地址。如目录和文件名

params: 传递的参数

第一步:在AndroidManifest.xml中注册

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

intent-filter>

//注册scheme

//这里myapp一定要和html中scheme一致。

intent-filter>

activity>

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

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

打开app a>

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

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

怎么传值

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

name = wms1993

age = 24

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

/**

* create by wms1993

*/

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";

@Override

protected 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内查看的时候,这种情况会有如下问题:

当我们新闻app是已经打开的时候,我们从浏览器过来,当按下返回键的时候,是否能回到之前打开的界面?

当我们的新闻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 上,代码如下:

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:roundIcon="@mipmap/ic_launcher_round"

//如果想将整个应用都移动到则在这里添加

android:allowTaskReparenting="true"

android:theme="@style/AppTheme">

android:allowTaskReparenting="true"

android:name=".MainActivity">

intent-filter>

intent-filter>

activity>

application>

这样这个问题就解决了。

android 链接打开app,Android 实现浏览器打开app相关推荐

  1. 2023最新网站在QQ打开自动跳转浏览器打开(qq自动跳转浏览器代码)

    最新可用网站在QQ打开自动跳转浏览器打开,这个代码检测到是qq打开网站就会跳转到浏览器打开,不过在我测试的时候发现只能跳转到qq浏览器,其他浏览器不会跳. 把代码加到页面里面就行了,跳转打开会打开当前 ...

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

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

  3. 网页链接无法使用微信内置浏览器打开的解决方案,实现微信跳转外部浏览器打开网页

    最近很多做微信推广的朋友经常会问我为什么网页链接在微信内转发很容易被拦截,问我有没有办法解决.其实这并不难,只要我们实现微信跳转功能即可,下面给大家说说如何实现微信跳转外部浏览器的功能. 功能目的 生 ...

  4. ASP.Net Web 点击链接直接下载 不在浏览器打开

    目标是:用户点击链接直接弹出下载框,不在浏览器打开文件. 一般网站下载的功能,本以为直接把虚拟路径赋值给链接就行了,没想到测试的时候发现图片,文本和PDF格式的文件都自动在Firefox里面打开了,没 ...

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

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

  6. IE浏览器里面链接点击在Chrome浏览器打开

    常用网址汇总成一个网页,需要可以选择chrome或者IE浏览器打开,网址都是IP地址,基于IE浏览器开发,因此默认选择IE浏览器打开,跳转到chrome浏览器打开. <!DOCTYPE html ...

  7. 如何在微信复制链接直接可以用浏览器打开 微信调用手机浏览器打开指定链接

    由于微信的限制,应用文件在内置浏览器中下载全部被屏蔽掉,造成很多人用微信扫描二维码下载时,界面显示一片空白,容易误导以为在下载呢 <!DOCTYPE html> <html> ...

  8. html判断是否在微信里打开,JavaScript判断浏览器内核,微信打开自动提示在浏览器打开...

    微信会屏蔽 URL 自定义的 scheme ,导致无法跳转手机中的浏览器.网上有一些工具类网站可以实现直接跳转浏览器,之后有机会我会整理一下.我们今天只讨论通过 JavaScript 判断是否在微信浏 ...

  9. JavaScript判断浏览器内核,微信打开自动提示在浏览器打开

    微信会屏蔽 URL 自定义的 scheme ,导致无法跳转手机中的浏览器.网上有一些工具类网站可以实现直接跳转浏览器,之后有机会我会整理一下.我们今天只讨论通过 JavaScript 判断是否在微信浏 ...

  10. android 链接网络成功,Android之网络连接判断是否成功

    最近工作工程中遇到一个问题.问题很简单,这里做个笔记,Android进行网络联网的一些操作时,经常会对网络是否已经连接成功进行判断.我们通常会对wifi和移动网络进行判断,我们需要判断网络设备是否开启 ...

最新文章

  1. vs2015编译tensorflow v1.5
  2. 如何通过标签体系,打造精细化运营?
  3. 微信小程序之阻止冒泡事件
  4. 斑能不能彻底去掉_用茶树精油祛痘时,千万不能做这5件事!!!
  5. python求定积分的函数_手搓计算化学(GTO积分by python)
  6. Unreal Engine 4 —— 使用ProceduralMeshComponent实现模型实时切割
  7. 云控参数下发android,Oldboot鬼影又现,另一例山寨手机中运用云端远控技术的木马...
  8. C++ 虚函数,纯虚函数,抽象类整理
  9. mysql表级锁和行级锁_Mysql的表级锁和行级锁
  10. 【转】Eclipse,MyEclipse快捷键及字体设置
  11. go编译为linux可执行文件,go编译可执行文件
  12. canvas基础学习笔记
  13. matlab统计所有股票分析,MATLAB金融算法分析实战:基于机器学习的股票量化分析...
  14. CQ CSP-S2021游记
  15. 小白学习老九君C++笔记(10) 使用类创建对象
  16. python 等值线图_如何用Python绘出三值等值线图?
  17. 近世代数--特征--环的特征,域的特征
  18. 如何选相应的尺寸码数
  19. 乾隆皇帝大年夜都吃啥?
  20. 数据分析师 Mysql练习题(附答案)

热门文章

  1. Flink 第8.2章 Flink 的键组 KeyGroup 与 缩放 Rescale
  2. java通过url获取网页内容_java通过url获取网页内容
  3. mysql5.1免安装版_mysql5.1免安装版配置
  4. use after free double free利用
  5. goroutine并发扫描MySQL表_【扫描全能王】【干货】Goroutine Channel
  6. 删掉启动分区进不了系统,复活办法(win10)
  7. 加密狗只是开始,区块链+文娱才是大趋势
  8. 编译原理教程_2 文法和语言
  9. java多态 -- 猫狗案列
  10. 项目中集成微信扫码登陆,绑定手机号功能