Android Activity的任务栈和四大启动模式

在安卓系统中默认每次启动一个Activity时,系统会创建一个实例,并按照先进后出的原则放入任务栈中,当我们按back键时,就会有一个activity从任务栈顶移除,重复下去,直到任务栈为空,系统就会回收这个任务栈。但是这样以来,系统多次启动同一个Activity时就会重复创建多个实例,这种做法显然不合理,为了能够优化这个问题,Android提供四种启动模式来修改系统这一默认行为。

Activity的四种启动模式如下: standard、singleTop、singleTask、singleInstance

Android 任务栈

任务栈是一个Android应用中所有Activity的集合,安卓系统使用栈的方式来管理其中的Activity,这个栈又被称为返回栈(back stack),栈中Activity的顺序就是按照它们被打开的顺序依次存放的。

任务栈的特点:

  • 任务栈是记录存放用户开启的activity的。
  • 一个应用程序一被开启系统就给他分配一个任务栈,当所有的activity都退出的时候,任务栈就清空了。
  • 当一个Activity启动了另外一个Activity的时候,新的Activity就会被放置到返回栈的栈顶并将获得焦点。前一个Activity仍然保留在返回栈当中,但会处于停止状态。
  • 当用户按下Back键的时候,栈中最顶端的Activity会被移除掉,然后前一个Activity则会得重新回到最顶端的位置。
  • 任务栈是一个典型的后进先出(last in, first out)的数据结构。只能向栈顶添加Activity,或者将栈顶的Activity移除掉。因此,返回栈
  • 任务栈的id是一个integer的数据类型 自增长的。
  • 在android操作系统里面会存在多个任务栈,一个应用程序一个任务栈。
  • 桌面应用和一般的应用程序是一样的,任务栈的行为也是一样。
  • 默认情况下,关闭掉一个应用程序,清空了这个应用程序的任务栈。应用程序的进程还会保留。
  • 程序打开时就创建了一个任务栈, 用于存储当前程序的activity,当前程序(包括被当前程序所调用的)所有的activity属于一个任务栈。
  • 一个任务栈包含了一个activity的集合, 可以有序的选择哪一个activity和用户进行交互,只有在任务栈栈顶的activity才可以跟用户进行交互。
  • 任务栈可以移动到后台,并且保留了每一个activity的状态. 并且有序的给用户列出它们的任务, 而且还不丢失它们状态信息。
  • 退出应用程序时,当把所有的任务栈中所有的activity清除出栈时,任务栈会被销毁,程序退出。

standard-标准模式

这个模式是默认的启动模式,即标准模式,在不指定启动模式的前提下,系统默认使用该模式启动Activity,每次启动一个Activity都会重写创建一个新的实例,不管这个实例存不存在,这种模式下,谁启动了该模式的Activity,该Activity就属于启动它的Activity的任务栈中。在standard模式任务栈中无论该活动有没有加入栈,活动都会被创建,这个Activity它的onCreate(),onStart(),onResume()方法都会被调用。

singleTop-栈顶复用模式

这个模式下,如果要启动的Activity已经存在实例在栈顶,那么这个Activity不会被重新创建,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewIntent方法,需要注意的是这个Activity它的onCreate(),onStart()方法不会被调用,因为它并没有发生改变。如果栈顶不存在该Activity的实例,则情况与standard模式相同,创建新的Activity实例。

关键字:栈顶

singleTask-栈内复用模式

这个模式下,如果要启动的Activity在任务栈中存在实例,那么这个Activity不会被重新创建,而是移除(Destory)任务栈中在该实例之上的所有Activity,把目标实例置于栈顶并直接调用它的onNewIntent()方法。若不存在则新建。

在同一个任务栈中只存在一个实例。

singleInstance-单例模式

该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

posted @ 2017-12-16 17:29  whieenz  阅读(1763)  评论(1编辑  收藏  举报