1.简介

Android四大启动模式分别为Standard,SingleTop,SingleTask,SingleInstance,其中前面三种平时使用的比较多此处不多做解析,重点分析下SingleInstance这种启动模式。SingleInstance为栈内单实例模式,顾名思义就是使用该模式下的Activity创建时候,如果该对象没有被创建则会独立开辟栈来存储该Activity的实例,如果被创建了就直接使用,生命周期的回调跟SingleTask类似,主要不同的是SingleInstance栈内只有一个实例。

2.SingleTask与SingleInstance区别

其他Activity跳转到SingleInstance的Activity时会明显感觉出来是任务的切换,就像一个App去拉起另外一个App的效果。原因很简单,SingleInstance不只开启了独立栈,也默认开启了独立的任务(但该独立任务在系统后台不会独立展示,需要配置taskAffinity才独立展示),而SingleTask不会开启独立栈,也不会开启独立任务,需要配置taskAffinity不同于当前页面才会创建独立任务并在系统独立展示。如果想去掉任务切换效果有两个方案:

1.去掉任务切换动画(通过style给Activity设置)

2.通过startActivityForResult跳转 (推荐)

通过该方法跳转默认使用Context所在Actiivty的任务taskId,相同的taskId自然就相当于在同一个任务中跳转,所以没有任务之间切换的效果了。

3.SingleInstance和其他启动模式Activity间的切换

3.1  ActivityA打开SingleInstance的ActivityB,之后home键回到手机桌面,之后再点击图标打开该App会直接打开ActivityA,因为点击图标打开时候系统拉起的是该App的主任务(App根页面所在的任务),而不是独立栈独立任务的ActivityB。

处理方法:自定义AtyManager类管理当前Activity的打开列表,BaseActivity中onCreate和onDestory和finish中分别重写add和remove方法(注意onDestory会有延迟所以在finish也remove一次)。在ActivityA中onResume判断home回到桌面时的页面任务id不同于ActivityA任务id则通过startActivity打开或者ActivityManager的moveTaskToFront方法拉起对应任务。

3.2 ActivityA打开SingleInstance的ActivityB,之后menu键查看手机后台启动任务,之后直接点击ActivityB打开,再finish掉ActivityB会直接回到手机桌面(像闪退一样)。因为当menu键按下的时候其实系统全部任务回到系统后台,再从任务列表中打开则只是打开当前独立的任务,所以底下打开的已经没有了ActivityA所在的任务,自然ActivityB返回就直接到了手机桌面。

   处理方法:同上,ActivityB finish的时候判断上一个页面是否和当前任务id相同,不同则通过startActivity打开或者ActivityManager的moveTaskToFront方法拉起对应任务。

3.3 Android 11上在SingleInstance打开的Activity按home键再点桌面图标发现App被重启了。原因Android11做了任务中不用或不在最上层的栈清理工作。添加taskAffinity不同于主任务可以解决该问题,但在手机后台任务列表中会多出该任务的展示。在任务的根Activity设置excludeFromRecents="true",用于不展示当前任务到系统后台任务列表,然而这个api是个坑,当前App在前台的时候menu按键看到还是会有多个任务在系统,但如果当前App不在前台按menu则看到该App只有唯一的系统任务,所以我觉得不适用。为兼容Android 11上SingleInstance页面问题,只能是设置taskAffinity让其多个后台任务(参考微信的小程序就是SingleInstance方案)

4.总结

SingleInstance还是坑不少的,非必要请勿用。如果非要用则遇坑填坑,干不掉bug就干掉需求,干不掉需求就干掉提需求的人(*^__^*)

Android启动模式SingleInstance相关推荐

  1. android singleinstance home,Android启动模式之singleinstance的坑

    前言 在实际应用中,使用singleinstance启动模式时,会遇到一些奇奇怪怪的问题.Android有四种启动模式,分别是standard,singleTop,singleTask,singleI ...

  2. Android 启动模式简介

    2019独角兽企业重金招聘Python工程师标准>>> 预备知识 启动模式 standard模式(默认):只要创建了Activity实例,一旦激活该Activity,则会向任务栈中加 ...

  3. Android启动模式详解

    "在整理完启动模式后,我发现大家对启动模式的理解是有误区的" 引言 再谈启动模式,貌似没啥意思.但是你能正确回答下面的问题吗? 问题1:singleTask启动模式,在启动新的Ac ...

  4. android 启动模式_安卓学习笔记之Android中Activity的4种启动模式

    根据Activity在任务栈中的调用方式不同,Activity的启动模式分为4种,分别是Standard.SingleTop.SingleTask以及SingleInstance.可以在Android ...

  5. android任务栈的作用,Android 启动模式以及任务栈

    1.Android 主要包含4种启动模式,下面分别介绍四种启动方式的特点: 1)tandard 默认的启动模式,标准模式 每开启一个Activity,就会在栈顶添加一个Activity实例.多次间隔或 ...

  6. Activity启动模式singleInstance

    转载请注明出处 Activity有四种启动模式,这次重点描述的是singleInstance singleInstance会启动一个新的栈结构,而且不允许别的Activity实例进入此栈结构. 首先定 ...

  7. Android启动模式介绍

    安卓Android一般有Meta.Normal.Bootloader.Recovery.Factory等启动模式,这些模式都需要在系统启动时通过按键等方式触发进入,除了Normal模式,其它模式都属于 ...

  8. AndroidStudio安卓原生开发_Activity的启动模式singleInstance启动模式---Android原生开发工作笔记88

  9. android启动模式

    Activity加载模式 standard: 标准模式,一调用startActivity()方法就会产生一个新的实例. 对于每一个启动Intent都会生成一个activity的新实例. 跳转源和目的a ...

最新文章

  1. 2019.1.11英语笔记1
  2. 令牌桶限流之redis-cell的安装,使用,详解
  3. android如何适配平板,适用于平板电脑、大屏设备和可折叠设备的自适应布局
  4. 如何在JavaScript中使用when()有条件地更改值
  5. atitit.userService 用户系统设计 v4 q316 .doc
  6. HDU - 1043 Eight (A*搜索)
  7. Delphi中CoInitialize之探究
  8. 加速晶圆代工业务创新 开创智能互联世界
  9. switch/case语句中,每个case后{}的意义
  10. 夏泽网 中国渔业统计年鉴年鉴资料网
  11. ADNI-MRI-PET-ANALYSIS
  12. 如何使用计算机做统计,电脑如何使用Excel表格统计男女生数
  13. Visual Studio无法下载及安装
  14. 什么是 Linux ?什么是操作系统
  15. MATLAB约当标准型,用MATLAB求其约当标准型状态空间表达式
  16. L1正则化优化问题的一种求解方法
  17. python利用有道翻译做一个实时翻译软件
  18. python资讯_python学习-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....
  19. Win32环境下轻松调试单板安全模式软件下载功能
  20. Spring WebFlux

热门文章

  1. 控制教程 —— 介绍篇:4.根轨迹控制器设计
  2. 学遥感必读的十本专业书
  3. ElasticSearch 的分数 (_score) 是怎么计算得出 (2.X 5.X)
  4. php 微信支付闪了一下,php,_微信公众号JS API支付,安卓没有效果(会闪一下就消失了),php - phpStudy...
  5. TinyPNG客户端
  6. 2011年11月13日之存款利息
  7. Hutool PinyinUtil(拼音工具类)使用详解
  8. Tensorflow2.0+Anaconda + Windows10+cuda10.0+python3.7+spyder安装教程
  9. 第十三届蓝桥杯省赛python(B组)赛后总结
  10. 利用shell脚本批量判断目标ip存活情况