Activity-运行状态及生命周期
Activity 是四大组件之一,提供一个屏幕,用户可以用来交互为了完成某项任务。
一个新 Activity 启动入栈后,它显示在屏幕最前端,处理是处于栈的最顶端( Activity 栈顶),此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态(active or running)。
当 Activity 失去焦点, 被一个新的非全屏的 Activity 或者一个透明的 Activity 被放置在栈顶,此时的状态叫做暂停状态(Paused)。此时它依然与窗口管理器保持连接, Activity 依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被强行终止掉。所以它仍然可见,但已经失去了焦点故不可与用户进行交互。
如果一个 Activity 被另外的 Activity 完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见, Activity 处于Stopped状态。当 Activity 处于此状态时,一定要保存当前数据和当前的UI状态,否则一旦 Activity 退出或关闭时,当前的数据和UI状态就丢失了。当系统内存需要被用在其他地方的时候,Stopped的 Activity 将被强行终止掉。
Activity 被杀掉以后或者被启动以前,处于Killed状态。这是 Activity 已从Activity堆栈中移除,需要重新启动才可以显示和使用。
注:4种状态中,Running状态和Paused状态是可见的,Stopped状态和Killed状态时不可见的。
当一个 Activity 实例被创建、销毁或者启动另外一个 Activity 时,它在这四种状态之间进行转换,这种转换的发生依赖于用户程序的动作。下图说明了 Activity 在不同状态间转换的时机和条件:
这个方法在每一个Activity类都会有,当我们新建一个 Activity 类时,一定会重写父类的 onCreate() 方法, onCreate() 方法会在Activity第一次被创建时调用 。我们应该在这个方法中完成 Activity 的初始化操作,比如说加载布局,初始化布局控件,绑定按钮事件等。
这个方法在 Activity 由不可见变为可见时调用。
这个方法在 Activity 准备好和用户交互的时候调用。此时的 Activity 一定位于返回栈的栈顶,并且处于运行状态。
这个方法在 Activity 被Dialog或透明的 Activity 覆盖的时候调用。
这个方法在 Activity 完全不可见的时候调用。它和 onPause() 方法的主要区别在于,如果启动的新Activity是一个对话框式的activity,那么, onPause() 方法会得到执行,而 onStop() 方法并不会执行。
这个方法在 Activity 被销毁之前调用,之后 Activity 的状态将变为销毁状态。
这个方法在 Activity 由停止状态变为运行状态之前调用,也就是 Activity 被重新启动了。
注:Android在界面跳转的时候,比如从 Activity B 跳回 Activity A,并不是先执行B的 onDestroy() ,而是执行完B的 onPause() 之后就立即跳回A里的 onResume() 。在执行了A 的 onResume() 之后一两秒甚至更长一点的时间才执行B里的 onDestroy() 。
这样的处理机制应该是为了能够立即响应用户的操作。这样的话一些操作就要放到 onPause() 里去执行。比如视频的暂停销毁或者一些反注册。所以对时间要求和 Activity 是否获取焦点密切相关的操作,不能放在 onCreate() 和 onDestroy() 里,而应该考虑放在 onResume() 和 onPause() 里