关于Activity的启动模式
来源:互联网 发布:大唐 数据所 编辑:程序博客网 时间:2024/05/22 13:44
最近被问到很多次的Activity的启动模式,故专门参考了相关书籍,比如《Android的开发艺术探索》特此做个总结。
首先我们需要知道,在默认情况下,当我们启动同一个Activity的时候,系统会创建多个实例并把它们一一放入到任务栈中(先进后出的栈结构)。但是,像每次创建实例的这样过 程我们并不是很需要,如果只可以创建一次就可以了。于是乎,Android给我们提供了四种启动模式:standard,singleTop,singleTask,singleInstance。
1.standard:标准模式,也是系统的默认模式。每次启动一个Activity都会重新创建一个新的实例(不管该实例是否已经存在)。创建实例的过程符合Activity的生命周期(如onCreate,onStrat,onResume)。在这种模式下,谁启动了这个Activity,那么这个Activity的实例就在启动它的Activity的任务栈中。比如,Activity A启动了Activity B,同时Activity A属于任务栈A,则Activity B属于任务栈A。
2.singleTop:栈顶复用模式。在这种模式下,如果当过当前Activity处于栈顶位置,则此Activity不会被重建,同时它的onNewIntent方法(通过此方法的参数我们可以取出当前请求的信息)会被回调。如果该Activity的实例已存在,但不在栈顶,那么新的Activity仍会重建。比如,当前的栈内有ABCD四个实例,D位于栈顶,当重新启动一个D之后,栈内的情况还是ABCD.如果D位于栈底,A位于栈顶,重新启动一个D之后,栈内的情况为DCBAD。
3.singleTask:栈内复用模式。这是一种单实例模式。在这种情况下,只要任何一个栈中存在该Activity的实例,那么多次启动都不会重新创建。详细点说就是,当启动一个Activity A的时候,系统首先会寻找是否存在该A所需要的栈,如果不存在,则创建一个任务栈,并把A的实例放入到栈中。如果存在A所需的栈,然后查看该栈中是否存在A的实例,如果存在,则把A调到栈顶并调用它的onNewIntent方法,如果实例不存在,则创建A的实例,并放入到栈中。
1.如目前任务栈s1中存在ABC三个实例。这个时候Activity D以singleTask模式启动,且需要的任务栈为s2。由于任务栈s2和D的实例都不存在,所以首先会新建s2任务栈,然后 将D的实例放入到s2中。
2.假如将第一种情况中,D的实例所需的任务栈变为S1,则由于s1已经存在,所以系统会直接创建D的实例并放入到s1中。
3.假如D所需的任务栈为s1,且当前的栈中的实例为ADBC(C为栈顶).这种情况下,当启动D的时候,由于栈中已经存在D的实例,所以系统不会重新创建D的实例,并且将D放 置到栈顶位置。由于singleTask默认有clearTop的效果。,所以当前栈中的情况为AD。(B,C已经出栈)
4.singleInstance:单实例模式。这是一种加强的singleTask模式。以此种模式启动的Activity的只能单独的位于一个独立的任务栈中。比如Activity A以该模式启动,则系统会为A创建一个新的任务栈,然后A独立运行在这个任务栈中,由于栈内的复用性,后续的请求均不会创建新的Activity.
- 关于Activity的启动模式
- 关于Activity的启动模式
- 关于Activity的启动模式
- 关于activity的启动模式的理解
- 关于Activity启动模式的理解
- 关于activity的singletask启动模式记录
- 关于代码实现activity的启动模式
- 关于Activity的启动模式(一)
- 关于Activity的四种启动模式
- 关于Activity活动的启动模式
- 关于Activity启动模式的理解
- 关于Activity的四大启动模式
- 关于Activity的生命周期与启动模式
- 关于android activity启动模式
- activity的启动模式
- Activity的启动模式
- Activity的启动模式
- Activity的启动模式
- The Python Challenge Level 0-1 Solutions
- java经典问题算法大全
- C++学习笔记01之类的基本实现过程(头文件的防卫式定义, 具体类的定义和实现, 函数的传递类型和返回类型)
- 树莓派桌面任务栏 LXPanel 不小心删除恢复的教程
- 作为一个Android开发者,你所需要掌握的东西
- 关于Activity的启动模式
- 数据预处理之缺失值插补 — 基于R语言
- React Native实战(二):Android的打包
- java算法二
- PHP的验证码入门
- ubuntu install gcc 4.8
- 使用路由器来防止ARP攻击-----[TP-Link router]
- JAVA进阶3.1——Equals方法(1)
- 使用dynamic module 3.0的时候报null point异常