Kotlin安卓编程—-生命周期以及启动方式

在之前的学习中,我们可以发现,Activity是的层叠的。当我们启动一个新的Activity,其就会覆盖在原Activity之上,然后点击Back键就会销毁最上面的Activity,下面的Activity就会重新显示出来。

而这一过程就通过一个栈来实现。

Activity状态

activity最多存在4种状态:

1.运行状态

当一个Activity位于栈顶时(基本等于当前正在使用的Activity),Activity就处于运行状态。

2.暂停状态

当一个Activity不再处于栈顶位置,但仍然可见时,Activity就进入了暂停状态。这里我们需要知道,不在栈顶的Activity不一定不可见。不是所有Activity都会占用全部屏幕。如对话框形的Activity只会占据一部分,此时,这个Activity处于暂停状态。

3.停止状态

当一个Activity不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。但此时Activity仍处于栈当中,系统仍然会保存相应的状态和成员变量。

4.销毁状态

当Activity从返回栈种移除后就变成了销毁状态。

回调方法

针对这4个状态,便产生了7个状态回调方法:

  • onCreate()。 最基础的方法,每个Activity都需要重写,它会在Activity被第一次创建时调用。
  • onStart()。 当Activity从不可见变为可见时调用(包括创建后)
  • onResume()。 这个方法在Activity准备好和用户进行交互的时候调用。此时Activity位于栈顶,并处于运行状态。
  • onPause()。这个方法在系统准备去启动或者恢复另一个Activity的时候调用。
  • onStop()。这个方法在Activity完全不可见的时候调用。与onPause()的区别是,当启动的是一个对话框式的Activity,只会调用onPause()方法。
  • onDestroy()。这个方法在Activity被销毁之前调用。
  • onRestart()。这个方法在Activity由停止状态变为运行状态之前调用,即重新启动onStart()

除此之外,为了防止Activity处于停止状态而被系统回收,导致数据丢失,Activity还提供了一个onSaveInstanceState()方法,该方法会在Activity被回收前调用。该方法会携带一个Bundle类型的参数,Bundle提供了一系列的方法用于保存数据。

此时,我们就可以使用onCreate()方法后的Bundle参数来恢复数据了。

Activity的启动模式

Activity存在4种启动模式:standard、singleTop、singleTask、singleInstance

可以在AndroidManifest.xml中通过给标签指定android:launchMode属性来选择启动模式。

standard

默认的启动模式在standard模式下,每当启动一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置对于使用standard模式的Activity,系统不会在乎这个Activity是否已经在返回栈中存在,每次启动都会创建一个该Activity的新实例。

即如果我们在FirstActivity的基础上再次启动FirstActivity,则会创建一个新的FirstActivity实例,此时栈里将会存在两个FirstActivity。

singleTop

使用singleTop模式。当Activity的启动模式指定为singleTop,在启动Activity时如果发现返回栈的栈顶已经是该Activity则认为可以直接使用它,不会再创建新的Activity实例。

即如果你再FirstActivity基础上再想去启动FirstActivity,并不会创建新的实例,此时栈里只有一个FirstActivity。

不过当FirstActivity并不处于栈顶,如我们再次打开一个SecondActivity再在此基础上启动FirstActivity,就会创建一个新的FirstActivity实例,此时栈里存在两个FirstActivity

singleTask

使用singleTop模式可以很好地解决重复创建栈顶Activity的问题,而singleTask则解决了Activity实例重复的问题。

当Activity的启动模式指定为singleTask,每次启动该Activity时,系统首先会在返回栈中检查是否存在该Activity的实例,如果发现已经存在则直接使用该实例,并把在这个Activity之上的所有其他Activity统统出栈,如果没有发现才会创建一个新的Activity实例。

这样就确保无论什么情况,Activity只会存在一个实例在栈中。

singleInstance

singleInstance模式是4种启动模式中最特殊也最复杂的一个。指定为singleInstance模式的Activity会启用一个新的返回栈来管理这个Activity。

假设我们的程序中有一个Activity是允许其他程序调用的,如果想实现其他程序和我们的程序可以共享这个Activity的实例,使用前面3种启动模式肯定是做不到的,因为每个应用程序都会有自己的返回栈,同一个Activity在不同的返回栈中入栈时必然创建了新的实例。而使用singleInstance模式就可以解决这个问题,在这种模式下,会有一个单独的返回栈来管理这个Activity,不管是哪个应用程序来访问这个Activity,都共用同一个返回栈,也就解决了共享Activity实例的问题。