一:前言

四种模式分别为standard, singleTop, singleTask, singleInstance。自己应该明确一个概念先,single到底要single什么。每一个应用app都有一个包名,然后每一个应用都会有一个task,这个task和包名对应起来,如果要创建一个新task,名字就得不一样。

  • 一个应用会有一个包名,应用中默认有一个以包名为名字的task
  • task是一个概念,实现是stack栈。
  • task用来管理activity,一个activity转到另一个activity,就会把新activity压栈,遵循先进后出。
  • task中的activity可以跨应用,比如说app中跳转到微信,然后按返回键又可以回到自己那个应用。

二:如何改变启动模式

  1. 在manifest中对activity设置
  2. 更改Intent启动activity时的flag

三:直接从singleTop开始

三个activity,activity1可以跳转到activity2,activity2可以跳转到activity3.

1:第一种情况,栈顶已有实例

  1. 栈底---------------------------------------》栈顶
  2. acitivity1 activity2 acitivity3
  3.  
  4. 这时候以singleTop模式启动activity3,重用旧实例, 备注:顺便调用activity3onNewIntent()方法
  5.  
  6. 栈底---------------------------------------》栈顶
  7. acitivity1 activity2 acitivity3

2:第二种情况,栈顶没有实例

  1. 栈底---------------------------------------》栈顶
  2. acitivity1 acitivity3 activity2
  3.  
  4. 这时候以singleTop模式启动activity3,创建新实例
  5.  
  6. 栈底---------------------------------------》栈顶
  7. acitivity1 acitivity3 activity2 activity3(new)

四:很简单的singleTask

注意要在manifest中设置

  1. android:launchMode="singleTask"

(我发现设不设置intent的flag都没用,关键是设置这个,只设置flag没有用)

1:第一种情况,在manifest中没有设置了taskAffinity

当前task没有这个activity的实例就创建一个,放在栈顶;若是有实例,就把那个实例上面的activity全部出栈(销毁),并调用要启动的activity实例的:onRestart, onStart, onResume

  1. 栈底---------------------------------------》栈顶
  2. acitivity1 acitivity3 activity2
  3.  
  4. 这时候以singleTast模式启动activity3,但没有taskAffinit
  5. 会把已有的activity3上面的activity,即activity2出栈,销毁
  6. 并调用已有的activity3onRestart,onStart, onResume
  7.  
  8. 栈底---------------------------------------》栈顶
  9. acitivity1 acitivity3 (old)

即singleTask确保在当前task实例唯一

2:第二种情况,在manifest中设置了taskAffinity

2.1:这个task已被创建

  1. 栈底---------------------------------------》栈顶
  2.  
  3. task1:
  4. acitivity1 acitivity3 activity2
  5.  
  6. task2:
  7. acitivity1 acitivity3 activity2
  8.  
  9. singleTask模式启动activity3,指定task2,表现和第一种情况一样
  10. 把上面的activity都出栈

  1. task1:
  2. acitivity1 acitivity3 activity2
  3.  
  4. task2:
  5. acitivity1 acitivity3(old)

2.2:这个task未被创建

  1. 栈底---------------------------------------》栈顶
  2.  
  3. task1:
  4. acitivity1 acitivity3 activity2
  5.  
  6. singleTask模式启动activity3,指定task2
  7. 会创建task2,并创建新实例放进去
  8.  
  9. task1:
  10. acitivity1 acitivity3 activity2
  11.  
  12. task2:
  13. activity3(new)

ps:之后activity3启动的其他activity,除非新指定task,否则都在activity3所在的栈中了,即所谓嫁鸡随鸡嫁狗随狗


singleTask名字误导很大,我觉得名字为singleAtTask更贴切。

五:更简单的singleInstance

启动模式为singleInstance的activity,在整个手机中,只能有一个实例,再次调用的时候,会找到这个实例并把它调到前台

比如说activity1已singleInstance模式启动,那就把它调到前台(已存在的话)。

  • activity1属于一个唯一的task,这个task只有它一个
  • activity1启动其他activity,若这个activity指明taskAffinit(即使不是singleTask模式),就在指明的task中创建,若没有指明taskAffinit,就默认找应用包名的task。这边逻辑和singleTask很像了。

参考资料:https://blog.csdn.net/zhangjg_blog/article/details/10923643

     https://www.kancloud.cn/alex_wsc/android_art/1828110

理解Android的四种启动模式的更多相关文章

  1. Android Activity 四种启动模式

    task和back stack(任务和回退栈) 任务启动,task被加入到回退栈的栈顶,返回的时候回退栈的栈顶任务会被弹出,并被销毁,栈中的前一任务恢复运行,当activity销毁是,系统不会保留ac ...

  2. android:Activity四种启动模式简单介绍

    Activity启动模式 能够依据实际的需求为Activity设置相应的启动模式,从而能够避免创建大量反复的Activity等问题 Activity有四种载入模式 1.standard(默认启动模式, ...

  3. android launchmode(四种启动模式)应用场景及实例

    模式介绍 [1] standard 模式 这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中. [2] singleTop 模式 如果在任务的栈顶正好存在该Activ ...

  4. android activity四种启动模式

    1.standard <activity android:name=".MainActivity" android:launchMode="standard&quo ...

  5. Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。

    原文:Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式. Android Activity 的四种启动模 ...

  6. Android中Activity的四种启动模式

    要了解Android的启动模式先要了解一下Activity的管理方式: 1.Activity的管理机制 Android的管理主要是通过Activity栈来进行的.当一个Activity启动时,系统根据 ...

  7. 关于android的Activity的四种启动模式

    最近做项目遇到一个问题,当触摸屏幕的时候通过intent启动activity,发现会启动多次,而后查阅资料,发现,原来是activity的模式设置问题. Activity的启动模式可以通过Androi ...

  8. Android 关于Activity的四种启动模式的简单介绍

    Activity启动模式设置: <activity android:name=".MainActivity" android:launchMode="standar ...

  9. Android之Activity系列总结(三)--Activity的四种启动模式

    一.返回栈简介 任务是指在执行特定作业时与用户交互的一系列 Activity. 这些 Activity 按照各自的打开顺序排列在堆栈(即返回栈,也叫任务栈)中. 首先介绍一下任务栈: (1)程序打开时 ...

随机推荐

  1. idea Error : java 不支持发行版本5

    问题描述 在Intellij idea中新建了一个Maven项目,运行时报错如下:Error : java 不支持发行版本5 解决 1.在Intellij中点击"File" --& ...

  2. Scala(一)【安装和IDEA中开发】

    目录 一.下载 二.windows安装 三.linux环境安装 四.Ida开发Scala 1.在线下载Scala插件 2.离线下载Scala插件 3.验证 五.HelloWorld入门程序 1.新建M ...

  3. 大数据学习day38----数据仓库01-----区域字典的生成

    更多内容见文档 1. 区域字典的生成 mysql中有如下表格数据 现要将这类数据转换成(GEOHASH码, 省,市,区)如下所示 (1)第一步:在mysql中使用sql语句对表格数据进行整理(此处使用 ...

  4. 转 android开发笔记之handler+Runnable的一个巧妙应用

    本文链接:https://blog.csdn.net/hfreeman2008/article/details/12118817 版权 1. 一个有趣Demo: (1)定义一个handler变量 pr ...

  5. ORACLE dba_objects

    dba_objects OWNER 对象所有者 OBJECT_NAME 对象名称 SUBOBJECT_NAME 子对象名称 OBJECT_ID 对象id DATA_OBJECT_ID 包含该对象的se ...

  6. Spring Batch : 在不同steps间传递数据

    参考文档: How can we share data between the different steps of a Job in Spring Batch? Job Scoped Beans i ...

  7. linux网络相关命令之脚本和centos启动流程

    nice 功用:设置优先权,可以改变程序执行的优先权等级.等级的范围从-19(最高优先级)到20(最低优先级).优先级为操作系统决定cpu分配的参数,优先级越高,所可能获得的 cpu时间越长. 语法: ...

  8. 基于docker 操作mysql5.7

    1. 安装好 docker 2. 拉取 mysql5.7 镜像: docker pull mysql:5.7 其他版本 mysql:https://hub.docker.com/_/mysql?tab ...

  9. python实现skywalking的trace模块过滤和报警

    skywalking本身的报警功能,用起来视乎不是特别好用,目前想实现对skywalking的trace中的错误接口进行过滤并报警通知管理员和开发.所以自己就用python对skywalking做了二 ...

  10. Redis - 2 - 聊聊Redis的RDB和AOF持久化 - 更新完毕

    1.RDB 1.1).RDB是什么? RDB,全称Redis Database RDB是Redis进行持久化的一种方式,当然:Redis默认的持久化方式也是RDB 1.2).Redis配置RDB 1. ...