深入理解Activity-任务,回退栈,启动模式
一、任务、回退栈的概念
一个任务是多个能够和用户进行交互并且能完成某种功能的activities的集合。 这些Activity被安排回退栈中,能在合适的时候被打开显示出来。
在我们使用Android手机的时候,当通过点击一个图标来启动一个应用的时候,此时任务就来到了前台,如果此时还没有创建过这个任务的话,一个新任务就会被创建(也就是最近没有使用过这个应用的时候),并且第一个启动的Activity 被放置在该任务的回退栈中。
二、回退栈的栗子
当一个Activity启动了一个新的Activity的时候,新的Activity被加入到栈顶。之前的Activity仍然在栈中,但是已经停止了(执行onStop)。这个时候系统仍然保存这他的用户界面的状态,如果此时用户单击了Back键返回,当前的Activity(新打开的)由于在栈顶,所以被从栈中推出去了(也就是Activity会执行生命周期的 onDestroy方法去销毁)。在一个回退栈中的Activity不会重新排列,它的方式是“后进,先出“的。看官网給的一幅图帮助我们理解:
如果我们一直单击回退键,此时栈中会一次按照后进先出的方式将Activity一一出栈,当栈中不存在Activity时,就回到了我们的Home 界面了。
三、任务的栗子
任务我们可以理解为它包含着回退栈(back stack),它是能在后台运行的。when users begin a new task or go to the Home screen, via the Home button. While in the background, all the activities in the task are stopped, but the back stack for the task remains intact—the task has simply lost focus while another task takes place, as shown in figure 2.当用户启动一个新任务(例如在当前应用调用了其他应用)或者点击home键的时候,我们此时的任务就在后台运行了,该任务对应的栈中的所有Activity都被停止(执行了了onStop方法),但是注意此时该任务中的回退栈依然存在,它仅仅是失去了焦点。具体情况看下图:
上面的情况在大家用手机的时候就可以打开两个不同应用然后点击home键切换去感受,就不举个栗子了。值得注意的是,如果当我们系统的内存不足的时候,系统可能会干掉我们的某个任务。
上面我们也说过了,由于回退栈具有“后进先出“的特点,它里面的Activity是不可以重新进行排列的。那我们大家想象一种情况:如果我们新建了一个ActivityA,然后放置一个Button,每次点击Button又启动ActivityA,这样我们连续点击多次。回退栈里面就会一直添加ActivityA的多个实例,当我们点击回退键的时候,每次都是一个ActivityA。这很明显不是我们要的效果,难道我们不可以每次启动的时候把ActivityA就用之前加入的那个ActivityA吗。android系统当然考虑了这种情况,这就是管理任务的方式–启动模式
四、启动模式
我们可以通过启动模式来修改修改系统的默认行为
启动模式主要有四种,他们分别是:standard,singleTop,singleTask,singleInstance。
standard(标准模式)
这是系统的默认模式,也就是每次启动activity都会创建一个新的实例。需要注意的是,每个实例可以属于不同的任务栈,每个任务栈也可以对应多个实例。谁启动了该模式的activity,一个该activity的实例就会被放置到谁的任务栈中。singleTop(栈顶复用模式)
根据它的名字我们就可以想到,如果一个activity已经存在于一个任务栈中,那么系统就不会创建一个该activity的新实例,而是使用栈顶的activity实例,并且调用该activity的onNewIntent()的方法。在这种情况下,一个activity也能被实例化多次,每个实例能属于不同的任务,每个任务也能有多个实例(只有在activity在栈顶的时候,不会重新创建)singleTask(栈内复用模式)
如果一个activity存在于任务栈中,那么系统会使用该实例并且调用它的onNewIntent() 方法,这种模式下在一个任务中只能有一个实例。singleInstance(单实例模式)
这个模式除了拥有singleTask的所有特点外,在该模式下的activity实只能单独的在一个任务栈中。
最新文章
- java基础,继承类题目:编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E
- cell与cell之间的间距问题,以及section跟随屏幕滑动而滑动问题
- jQuery EasyUI API 中文文档 - ComboGrid 组合表格
- 聊聊SOA面向服务架构
- 【Leetcode】【Medium】Palindrome Partitioning
- HTable和HTablePool使用注意事项
- Linux就这个范儿 第11章 独霸网络的蜘蛛神功
- linux查看磁盘使用情况
- PHP 发邮件不换行
- IOS--UIImageView的使用方法
- 基于QEMU的ARM Cortex-A9开发板Vexpress-ca9的Linux内核的编译和运行
- html Embed用法 页面播放视频
- spark面试总结4
- noip第19课资料
- 细说Redis(二)之 Redis的持久化
- nginx最基本操作
- 【JMeter】JMeter如何输出测试报告
- windows10 卸载 Docker 和 DockerNAT
- Activity设置为对话框属性时(Theme.Dialog)时,改变其在屏幕中的位置
- laravel配置路由出现404
热门文章
- REHL5.5 linux的postfix的邮件服务器配置 (笔记)
- WCF配置工具及服务调试工具
- 实战:ASP.NET MVC中把Views下面的视图放到Views文件夹外
- 爬虫技术 -- 进阶学习(八)模拟简单浏览器(附c#代码)
- ruby -- 基础学习(七)时间的内置函数和格式说明
- 将查询字符串解析转换为泛型List的名值集合.
- App.js – 用于移动 Web App 开发的 JS 界面库
- Clipping Magic – 帮助你轻松删除图片背景
- Mysql大量插入随机数据方法--存储过程
- 点餐APP 冲刺一总结