移动互联网发展到今天,一个移动app需要和各种各样的外部链接关联,它不再仅仅从手机的桌面启动,更多的将会从其他的应用、浏览器链接、短信、二维码或者微信分享等渠道启动,这里涉及到的是各种各样的营销渠道和方式。

那么从我们的技术角度来说,我们今天要说明一下的是,从外部链接的方式启动app需要注意的地方。我们都是知道,在Android上外链方式启动app的方式是在manifest文件中的某个activity的intent-filter标签中设置好标签action、category和data的属性。

<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="scheme"/>
</intent-filter>

浏览器页面代码加载协议为android:scheme属性值的链接向系统发起调用服务请求,系统的广播系统就会匹配当前系统中的intent-filter,如果其子标签的action、category和data都匹配的话,则会调起此activity,如果app没有加载,则先加载app的apk到进程,再启动对应的activity。

坑和经验

问题来了,很多app的首页activity都是在显示完SplashActivity后再启动的,首页activity的launchMode都是设置为singleTask,确保实例的唯一性,当我们的app已经启动了的情况下,再次通过外链的方式启动首页activity是无法启动的。

从android的task堆栈角度来说,浏览器activity所在task是在浏览器的process当中的,而起启动SplashActivity后此activity是在浏览器所在的task,此时在SplashActivity中启动app的首页activity,而首页activity是在另外的process的task当中,故无法切换这个task到前台。

此时的解决方案是在启动首页activity的intent对象中添加FLAG_ACTIVITY_NEW_TASK,在浏览器器task中通过FLAG_ACTIVITY_NEW_TASK启动首页activity,此时系统会寻找和首页activity具有相同的taskAffinity的task,即找到app的process中首页所在的task,将此task推到前台,到此实现了通过外链的方式再次现身app首页activity的功能。

总结一下,FLAG_ACTIVITY_NEW_TASK针对启动的activity是否在同一个process中处理方式不一样,因为默认情况下相同应用中所有的activity的taskAffinity都相同,故如果是存在且在同一应用中,直接将被启动的activity入栈,否则新建一个task并入栈,故在我们的开发中,对于activity间的切换以及task间的切换需要深入理解才能做出优秀的软件。

[Android]有关外部链接唤醒App需要注意的坑的更多相关文章

  1. 在UC浏览器打开链接唤醒app,假设没有安装该app,则跳转到appstore下载该应用

    在UC浏览器打开链接唤醒app,假设没有安装该app,则跳转到appstore下载该应用 须要在project中设置例如以下: 1.打开project中的myapp-Info.plist文件 2.打开 ...

  2. ios外部链接或者app唤起自己的app

    唤起自己的app,其实都是通过链接,关于这个需要了解下scheme,自己和调用方对接下协议,这里只是说明下到自己app指定页的问题 唤起自己的app分为两种情况 一.自己的app已经启动,那么唤起自己 ...

  3. Android编程实现点击链接打开APP功能示例

    本文实例讲述了Android编程实现点击链接打开APP功能.分享给大家供大家参考,具体如下: 在Android中点击链接打开APP是一个很常见的需求.例如,电商为用户发送优惠券之后经常会下发一条短信: ...

  4. 利用ios safari浏览器生成桌面快捷方式并唤醒app的示例代码

    html 内容: //通过a链接唤醒app  <a href="app约定好的scheme" id="qbt" style="display:n ...

  5. 手机浏览器_安卓_苹果手机Webview 中唤醒APP

    Url scheme是iOS,Android平台都支持,只需要原生APP开发时注册scheme, 那么用户点击到此类链接时,会自动跳到APP.比如 <!-- 打开考拉APP首页 --> & ...

  6. iOS universallinks唤醒app

    从iOS9之后,苹果就推出了这个功能,用来唤醒外部app.这个功能在那些电商app上使用尤其广泛,当你打开对应的h5网页后,上面跳出一个是否跳转app的按钮. 现在iOS11已经基本覆盖,iOS12也 ...

  7. 从浏览器或者Webview 中唤醒APP

    本文来自网易云社区 作者:刘新奇 移动互联时代,很多互联网服务都会同时具备网站以及移动客户端,很多人认为APP的能帮助建立更稳固的用户关系,于是经常会接到各种从浏览器.webview中唤醒APP的需求 ...

  8. 微信浏览器内 h5 直接唤醒 app 之 微信开放标签 wx-open-launch-app

    以前微信浏览器内想要直接唤醒 app 要么接微信的应用宝要么你是腾讯的干儿子. 而在微信在2020年5月分推出了“微信开放标签”功能 wx-open-launch-app 用于微信浏览器内直接唤醒 a ...

  9. Pyqt 打开外部链接的几种方法

    Pyqt 触发一个事件,打开外部链接,我找到了这个方法,供大家参考 1. QDesktopServices 的openUrl 方法 QtGui.QDesktopServices.openUrl(QtC ...

随机推荐

  1. [luoguP1417] 烹调方案(背包DP)

    传送门 By tinylic 如果没有b[i]这个属性的话就是明显的01背包问题. 现在考虑相邻的两个物品x,y.假设现在已经耗费p的时间,那么分别列出先做x,y的代价: a[x]-(p+c[x])* ...

  2. vue.js组件之间通讯的数据双向绑定----父亲把数据传递给儿子,儿子更改数据后,重新发送给父亲,父亲数据更改后,属性会重新发送个儿子,儿子刷新新数据

    vue组件是相互独立的,如果要交互通讯,这时候,就需要组件之间数据互通了 往常我们讲的都是数据传递,子传父,父传子,都没有说子和父,父与子之间的数据互通 父亲传递给儿子数据,儿子触发一个父亲方法,将最 ...

  3. [K/3Cloud]关于"选单"操作

    之前有些人对这块有些疑问,比如: 1.选单操作是否和下推基本一样,都是公用同一套单据转换规则,只不过下推是源单推目标单,选单是目标单去选择源单,最终操作结果一样? 2,我想实现选单的时候,选单列表先通 ...

  4. Memcached的Web管理工具MemAdmin(待实践)

    Memcached的Web管理工具有很多,但是最好用的应该是MemAdmin.基于PHP5开发,所以部署时要注意环境. 介绍:http://www.junopen.com/memadmin/ 下载:h ...

  5. srvctl error

    Hit an strange error just now. [oracle@racnode1 ~]$ srvctl # # An unexpected error has been detected ...

  6. Android Path路径设置,针对error opening trace file:No such file or directory

    对于android的开发者来说,首先要做的就是环境变量的配置.学习过java的人都知道,java是须要配置环境变量的,那么android开发是否也须要我们配置环境变量呢?当然,安卓的环境变量须要我们配 ...

  7. Java进程堆外内存(off heap)大小

    一.使用ByteBuffer.allocateDirect分配的off heap内存大小 本机进程 在Jvisualvm中安装 Mbeans插件.然后查看java.nio/BufferPool/dir ...

  8. 假期(MySQL相关)

    """ 一.初始数据库: - 数据库管理软件的由来 四个字:存储数据(简单暴力) - 数据库概述 :什么是数据:简单的说就是描述事物的记录称为数据:可以是数字,文字,图片 ...

  9. URAL 1822. Hugo II&#39;s War 树的结构+二分

    1822. Hugo II's War Time limit: 0.5 second Memory limit: 64 MB The glorious King Hugo II has declare ...

  10. zedboard 流水灯

    #include"xparameters.h"/* Peripheral parameters 外围的參数 */ #include"xgpio.h"/* GPI ...