Android中的Activity

Activity的生命周期和启动模式详解

Activity的状态

  • 运行状态:Activity位于返回栈的栈顶时就处于运行状态
  • 暂停状态:Activity不在栈顶,但仍然可见时,就处于暂停状态
  • 停止状态:Activity不在栈顶,且完全不可见的时,就处于停止状态。该状态下的Activity在内存紧张时可能被回收
  • 销毁状态:Activity从返回栈中移除,不在栈里后就变成了销毁状态,系统最倾向于回收处于这种状态的Activity

生命周期

Activity的生命周期流程图

  • onCreate:在Activity第一次被创建的时候调用,执行加载布局、绑定事件等
  • onStart:在Activity由不可见变为可见的时候调用
  • onResume:当焦点从未完全覆盖屏幕的Activity(弹窗等)切换到此Activity时(即此Activity准备好和用户进行交互时)调用,此时的Activity一定位于返回栈的栈顶,并且处于运行状态,在最前台
  • onPause:在系统准备去启动或者恢复另一个Activity的时候调用,该方法的执行速度要快,否则会影响到新的栈顶Activity的使用
  • onStop:在Activity完全不可见时调用。它和onPause方法的主要区别在于,若启动的新Activity是对话框式的,则onPause方法会执行,而onStop不会
  • onDestroy:在Activity被销毁之前调用,之后Activity的状态将变为销毁状态
  • onRestart:在Activity由停止状态变为运行状态之前调用,也就是Activity被重新启动了

Q:Activity A启动Activity B,那么BonResumeAonPause哪个先执行?

A:

A先执行onPause,紧接着B执行onCreate->onStart->onResume,接着执行AonStop

Q:Activity进入停止状态后被系统回收,如何还原数据?

A:

Activity中的onSaveInstanceState方法在Activity被回收前会被调用,它携带一个Bundle类型的参数用于保存数据。
可以在Activity中重写onSaveInstanceState方法,在Bundle对象中存入要保存的数据,
当Activity被回收后重新创建新的实例,在onCreate方法中可以获取到保存的Bundle对象。
判断当Bundle不为空时,对数据进行赋值还原。

Activity的返回栈

……

启动模式

Manifest.xml中修改Activity的launchMode切换Activity的启动模式

1
2
3
4
5
6
<activity android:name=".MainActivity"
android:launchMode="standard">
<intent-filter>
<!-- -->
</intent-filter>
</activity>

standard

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

singleTop

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

singleTask

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

singleInstance

指定为singleInstance模式的Activity会启用一个新的返回栈来管理这个Activity,这样不管是哪个应用程序来访问这个Activity,都共用同一个返回栈,也就解决了共享Activity实例的问题

Q:ABC三个Activity,其中ACstandardBsingleInstance,从A进入B再从B进入C。现在连按三次返回,返回顺序是怎样的?

A:

C返回到A再返回到B

这是因为AC处于同一返回栈,而BsingleInstance,单独处于一个返回栈。
因此C先出栈,A成为栈顶;A再出栈后返回栈为空,于是显示另一个返回栈的栈顶Activity,即B