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
,那么B
的onResume
和A
的onPause
哪个先执行?
A:
A
先执行onPause
,紧接着B
执行onCreate
->onStart
->onResume
,接着执行A
的onStop
Q:Activity进入停止状态后被系统回收,如何还原数据?
A:
Activity中的
onSaveInstanceState
方法在Activity被回收前会被调用,它携带一个Bundle
类型的参数用于保存数据。
可以在Activity中重写onSaveInstanceState
方法,在Bundle对象中存入要保存的数据,
当Activity被回收后重新创建新的实例,在onCreate
方法中可以获取到保存的Bundle对象。
判断当Bundle不为空时,对数据进行赋值还原。
Activity的返回栈
……
启动模式
在Manifest.xml
中修改Activity的launchMode
切换Activity的启动模式
1 | <activity android:name=".MainActivity" |
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:A
、B
、C
三个Activity,其中A
、C
为standard
,B
为singleInstance
,从A
进入B
再从B
进入C
。现在连按三次返回,返回顺序是怎样的?
A:
从
C
返回到A
再返回到B
。这是因为
A
、C
处于同一返回栈,而B
为singleInstance
,单独处于一个返回栈。
因此C
先出栈,A
成为栈顶;A
再出栈后返回栈为空,于是显示另一个返回栈的栈顶Activity,即B
。