Android学习笔记:活动(Activity)

一、活动的生命周期

1、活动状态

  • 运行状态
    当一个活动位于栈顶的时候,该活动就处于运行状态。(Android是使用任务栈来管理活动的,也称返回栈(Back Stack)。在默认情况下,每当我们启动一个新的活动,它会在返回栈中入栈,并处于栈顶位置。每当我们按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动会位于栈顶。系统总是会显示处于栈顶的活动给用户。)

  • 暂停状态
    当一个活动不再处于栈顶的位置,但仍然可见时,这时活动就进入了暂停状态。处于暂停状态的活动是完全存活的。

  • 停止状态
    当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。

  • 销毁状态
    当一个活动从返回栈中移除后就变成了销毁状态。

2、活动的回调方法

  • onCreate()
    Activity开始创建时
  • onStart()
    Activity正在被启动时(此时,Activity还不可见(在后台),还无法与用户交互)
  • onResume()
    ①Activity第一次启动完毕
    ②当前Activity被挡住一部分后,重新回到当前Activity时
  • onPause()
    Activity停止时,仍可见时
  • onStop()
    Activity不在UI最顶层,完全被挡住不可见时
  • onDestroy()
    Activity处于onStop()状态时(不可见时)重新回到UI最顶层
  • onRestart()
    Activity即将被销毁时

3、活动的生命周期

Android学习笔记:活动(Activity)
(1)Activity启动→onCreate()→onStart()→onResume()
(2)点击Home键回到主界面→onPause()→onStop()
(3)再次回到原Activity时→onRestart()→onStart()→onResume()
(4)退出当前Activity时→onPause()→onStop()→onDestroy()

二、活动的启动模式

启动模式一共有4种,分别是standard、singleTop、singleTask和singleInstance,可以在AndroidManifest.xml中通过给< activity >标签指定android:launchMode属性来选择启动模式。

  • standard(默认模式)
    standard是Activity默认的启动模式,在不进行显示指定的情况下,所有活动都会自动适应这种启动模式。对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建一个新的实例。
    示例如下:
    运行程序,在MainActivity中连续点击3次按钮,logcat打印信息如下图所示:
    Android学习笔记:活动(Activity)
    每点击一次按钮,就会新创建出一个新的MainActivity实例。此时返回栈中存在4个MainActivity实例(程序启动时也算一次),因此需要连续点击4次Back键才能退出程序。

  • singleTop(栈顶复用模式)
    当活动的启动模式指定位singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它。
    示例如下:
    修改启动模式,运行程序,可以看到已经创建了一个MainActivity实例,之后不管多少次点击按钮都不会再有新的打印信息。因为当前MainActivity已经处于返回栈的栈顶,每次想要再启动一个新的MainActivity时都会直接使用栈顶的活动,因此MainActivity只有一个实例,仅按一次Back键就可以退出程序。
    Android学习笔记:活动(Activity)
    当MainActivity并未处于栈顶位置时,这时再启动MainActivity,还是会创建新的实例。
    Android学习笔记:活动(Activity)
    在FirstActivity中再次启动MainActivity时,栈顶活动已经变成了FirstActivity,因此会创建一个新的MainActivity实例。

  • singleTask(栈内复用模式)
    当活动的启动模式指定为singleTask,每次启动该活动的时候系统会首先在返回栈中检查是否有存在该活动的实例,如果发现以及存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
    示例如下:
    在MainActivity点击按钮进入FirstActivity,然后在FirstActivity点击按钮,又重新回到MainActivity。
    Android学习笔记:活动(Activity)
    现在返回栈中只剩下一个FirstActivity的实例,点击一次Back键就可以退出程序。

  • singleInstance(单实例模式)
    指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动(如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)。在这种模式下,会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共同的用一个返回站,也就解决了共享活动实例的问题。
    示例如下:
    指定FirstActivity的启动模式为singleInstance,修改程序输出每一个活动的Task id。
    Android学习笔记:活动(Activity)
    由上图可以看到,FirstActivity的Task id不同于MainActivity和SecondActivity,这说明FirstActivity确实是放在一个单独的返回栈里面的,而且这个栈中只有FirstActivity这一个活动。
    (1)以singleInstance模式启动的Activity具有全局唯一性,即整个系统中只存在一个这样的实例。
    (2)以singleInstance模式启动的Activity在整个系统中是单例,如果在启动这样的Activity时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。
    (3)以singleInstance模式启动的Activity具有独占性,即它会独自占用一个任务,被它开启的任何Activity都会运行在其他任务中。
    (4)被singleInstance模式的Activity开启的其他Activity,能够在新的任务中启动,但不一定开启新的任务,也可能在已有的一个任务中开启。

三、未完待续