Activity是Android四大组件之一,是与用户交互的一个重要组件。在使用每一个Activity时,都需要在AndroidManifest.xml中进行相应的<activity>声明。
返回栈
Android使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,这个栈叫做返回栈(Back Stack)。栈是一种后进先出(Last In, First Out, LIFO)的数据结构,好比一个装积木的盒子,这个盒子就是返回栈,而一个个活动就是一块块积木。系统总是会显示处于栈顶的活动给用户。
当启动了新活动,它就会入栈并处于顶端位置,相当于把一块新的积木放到了盒子中并处于其他积木之上。
而当活动被销毁,处于栈顶的活动将会出栈,前一个活动将重新回到栈顶位置,相当于把最顶端的那块积木拿出盒子。
活动的状态
每个活动在生命周期中有四个状态:
- 运行状态(running):
- 当一个活动在屏幕的前景(在返回栈的顶端),与用户直接交互的时候,活动就处于运行状态;
- 暂停状态(paused):
- 当一个活动失去了焦点但是仍然可见(已经不在栈顶),即处于暂停状态。仍然可见指的是有其他并非全屏的活动(如对话框形式)占据了屏幕,而还是可以见到后方的处于暂停状态的活动。暂停状态的活动仍然是存活着的(所有状态及成员信息仍然依附在Window Manager中),但是在内存特别低的时候仍然有可能被系统回收。
- 停止状态(stopped):
- 当一个活动不再栈顶,也完全不可见的时候,活动处于停止状态。此时所有状态和成员信息仍然存在,但是容易在内存低的时候被回收。
- 销毁状态(destroyed):
- 从返回栈中移除的活动就变成销毁状态。
活动的生存期
Activity的生命周期有以下七个回调方法:
- onCreate():活动第一次创建时会使用,通常在该方法中需要完成各种初始化操作,如加载布局,绑定和触发等事件。
- onStart():在活动从不可见变为可见时调用。
- onResume():在准备好于用户交互时调用,此时活动就会处于返回栈栈顶,并开始运行。
- onPause():启动和恢复其他活动是调用,通常在该方法中释放一些CPU资源,保存关键数据。该方法执行速度要快才能不影响其他活动的启动。
- onStop():其他活动并使原来的活动完全不可见时,onStop()方法就会调用。
- onDestroy():在销毁之前调用,调用后活动就变成销毁状态。该方法发生在调用了finish()方法或者系统自动回收时。
- onRestart():在活动由停止状态变为运行状态之前调用。
活动的生存期可分为三类:
- 完整生存期(entile lifetime):在onCreate()和onDestroy()之间经历的。在onCreate()初始化操作,在onDestroy()释放内存。
- 可见生存期(visible lifetime) :在onStart()和onStop()之间经历的,在此期间活动一直可见。在onStart()加载资源,在onStop()释放资源。
- 前台生存期(foreground lifetime):在onResume()和onPause()之间经历的,在此期间活动总是处于运行状态且可交互的。
下图是Android官方提供的活动生命周期图:
- 一般来说我们第一次启动一个活动A,它将自动执行onCreate()、onStart()、onResume()方法,并开始处于运行状态。
- 当有其他活动启动到前台时,如果活动A仍然可见,则执行onPause()方法使其处于暂停状态,当活动A重新回到栈顶时,就执行onResume();如果活动A完全不可见了,则执行onPause()和onStop()方法使其处于停止状态,回到栈顶时就执行onRestart()和onResume()方法。假设在活动A运行状态时,启动了活动B,那么它们的执行顺序如下:
- A--onPause();
- B--onCreate();
- B--onStart();
- B--onResume();
- A--onStop();
- 在暂停状态和停止状态都有机会被系统回收,只是停止状态比暂停状态更容易被回收。
- 活动A被销毁时就会执行onDestroy()方法。
最后用《安卓权威编程指南》的另一张图来说明调用方法之后和活动生存期之间的关系,我们可以看到执行每个方法后活动状态的改变: