深入理解Activity的启动模式
众所周知,当我们多次启动同一个Activity时,会创建多个该Activity的实例,系统会按照先进后出的原则,将它们一一放进任务栈中,然后我们按back键,系统就会将栈顶的Activity移除栈,直至栈中没有Activity,系统就会回收这个任务栈。这就是默认的Activity启动模式:standard模式。在该模式下,每次启动Activity都会创建一个新的实例,不利于内存的利用,这种做法显然不合理,为了优化这个问题,Android提供4种Activity启动模式,在不同的情况下选择不同的复用机制避免出现实例重复创建问题。
进入正题,Acticity的启动模式如下:
standard、singleTop、singleTask、singleInstance
1、standard(标准模式)
这是系统的默认启动模式,不管这个Activity的实例是否存在于任务栈中或者和启动它的Activity是否在相同的任务栈中,每次启动Activity都会创建一个新的实例。这样创建的Activity会依次执行onCreate、onStart、onResume生命周期方法。这种情况下,谁启动了它,它就属于启动它的Activity的任务栈中,例如MainActivity启动MainActivity2,MainActivity2就会位于MainActivity所在任务栈的栈顶。具体查看日志的方法如下:adb shell dumpsys activity ,我们只看 Running activities (most recent first): 部分。
Running activities (most recent first):
TaskRecord{baa1051 #2748 A=me.bakumon.launchmode U=0 StackId=1 sz=2}
Run #12: ActivityRecord{1d38839 u0 me.bakumon.launchmode/.Main2Activity t2748}
Run #11: ActivityRecord{6a0be5 u0 me.bakumon.launchmode/.MainActivity t2748}
说明 Main2Activity 和 MainActivity 位于相同的栈:#2748,并且 Main2Activity 位于栈顶。
2、singleTop(栈顶复用模式)
这个模式下,如果Activity的实例已经存在在栈顶,启动它就不会再创建新的实例,而是会调用onNewIntent,通过此方法的参数我们可以去除当前请求的信息。随后会调用onResume方法,不再调用onCreate、onStart方法,因为它没有变化。如果没有存在的话,就会如同standard模式一样。这种模式可以用来防止多次打开同一个Activity。
对于以上的两种模式总结下:
standard和singleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task,即使你指定了taskAffinity属性。taskAffinity属性标识了一个Activity所需任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名。重要的是即使设置了taskAffinity属性,对standard和singleTop模式不会有任何影响,这两种启动模式下不会创建新的task。
3、singleTask(栈内复用模式)
在这个模式下,如果栈内存在该Activity的实例,不管是否存在于栈顶都不会再创建实例,而是会将该实例前的Activity清出栈顶(cleanTop),并且会回调onNewIntent方法。其实在这个过程中,首先是会进行任务栈的匹配,这个任务栈就是通过taskAffinity属性指定,如果不存在这个任务栈,就会创建一个任务栈,并将该Activity放入栈中。流程图比较清晰,如下所见:
4、singleInstance(全局唯一模式)
该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。
参考链接:
http://blog.csdn.net/mynameishuangshuai/article/details/51491074
https://juejin.im/post/591bd09a2f301e006bcd6e43
深入理解Activity的启动模式的更多相关文章
- Android开发艺术2之Activity的启动模式
Activity是Android的四大组件之一,他的重要性毋庸置疑,对于这么重要的一个组件,我们首先要知道这些都是由系统进行管理和回调的,要理解Activity的启动模式,我们首先来了解一下Andro ...
- Activity的启动模式(android:launchMode)
在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...
- 4种activity的启动模式
在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...
- Activity 的启动模式
好久没用过那几种activity的启动模式了,如今看到singletop竟然傻了眼,完全忘记了这几种启动模式的区别!隧将两年前的总结翻出来,通读一遍那晦涩难懂的记录,又理解了一遍,在以前记录的基础上, ...
- 我所理解的Android 启动模式
首先,这是从 一个开源网站转载的,觉得写得不错,对我们之前理解的activity的启动模式是一个新的理解方式,并给出实际的应用场景. 任务栈是什么 任务栈Task,是一种用来放置Activity实例的 ...
- Activity的启动模式--总结
3. Activity的任务栈Task以及启动模式与Intent的Flag详解? 2,Activity次级页面和主页间来回跳转,防止重复创建Activity实例 1, activity的启动模式: / ...
- Activity生命周期,切换,参数传递,bundle(包),值对象,Activity参数返回,Activity的启动模式
Activity代表手机屏幕的一屏,或是平板电脑中的一个窗口.它是android应用中最重要的组成单元之一,提供了和用户交互的可视化界面.在一个Activity中,可以添加很多组件,这些组件负责具体的 ...
- Activity之启动模式
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Ac ...
- 关于activity的启动模式
在Android中每个界面都是一个Activity ,界面的切换实际上是对不同Activity实例化的过程.而启动模式就决定Activity启动运行方式. 1.设置方式它是在主配置文件中,Activi ...
随机推荐
- Python之路-Linux命令基础(6)
作业一:完成作业未做完的集群架构 作业二:临时配置网络(ip,网关,dns)+永久配置 1.ip配置 [root@localhost mail]# ifconfig eno16777736 192.1 ...
- Windows下Nginx的安装与使用(一):配置端口转发
什么是端口转发 当我们在服务器上搭建一个图书以及一个电影的应用,其中图书应用启动了 8001 端口,电影应用启动了 8002 端口.此时如果我们可以通过: localhost:8001 //图书 lo ...
- 1.熟悉Java基本类库系列 - 目录
写这个系列是想让自己多熟悉熟悉Java的基本类库,忘记的时候可以在这里看看之前写过的例子,这样就可以很快的回忆起来如何使用了. 这样就可以很节省时间了. ======= 下面是传送门啦 ======= ...
- Redis基础学习(四)—Redis的持久化
一.概述 Redis的强大性能很大程度上都是因为数据时存在内存中的,然而当Redis重启时,所有存储在内存中的数据将会丢失,所以我们要将内存中的数据持久化. Redis支持两种数据持久化的方 ...
- 线段树(hdu 1556)
Problem Description: N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电 ...
- C#变量、常量、枚举、预处理器指令知多少
一.变量 C#共有其中变量类型有:静态变量.实类变量.数组元素.数值参数.引用参数.输出参数和局部变量 先定义一个简单的类来说明,如下: public class VariableDefine { p ...
- angular中路由的实现(针对新手)
最近搜了一下网上的教程,看完总感觉有点糊涂,对于新手来说可能云里雾里,所以写一个最简单的路由来给大家做个指引. 首先当然需要准备angular,下载地址:https://angular.io/ 现在a ...
- Android之AIDL知识总结
1.AIDL介绍 AIDL是一个缩写,全称是Android Interface Definition Language,翻译为Android接口定义语言.主要用于线程之间的通信,本文主要以不同应用之间 ...
- 分分钟带你玩转 Web Services【2】CXF
在实践中一直在使用 JAX-WS 构建 WebService 服务,服务还是非常稳定.高效的. 但还是比较好奇其他的 WebService 开源框架,比如:CXF/Axis2/Spring WS等. ...
- 作死上CODEVS,青铜题
题面:输入一列整数,输出它们的总和.最大值.最小值.并从大到小输出. 先上一波伪代码,认真地做一波数组排序题. #include<stdio.h> #include<math.h&g ...