《Android Dev Guide》系列教程6:Android生命周期之activity生命周期

懒骨头(http://blog.csdn.com/iamlazybone)

组件的生命周期

应用程序组件都有一个生命周期,从响应Intent的Android实例开始到这个实例被销毁。在这期间,他们或许有效或许无效,有效时或许对用户可见或许不可见。下面我们就来讨论四个基本组件的生命周期,包括在生命周期内的各种状态,以及状态之间的转换。这几种状态可能的结果是:进程让他们停止, 然后实例被销毁。

activity生命周期

一个activity有三个基本的状态:

@ 当activity在前台运行时(在activity当前任务的堆栈顶),为活动或者运行状态。这时activity会响应用户的操作。

@ 当activity失去焦点但是对用户仍然可见时为paused暂停状态。此时,别的activity在他的上面,透明或者备有被全部覆盖。所以其中一些暂停的activity也可以被显示。一个暂停的activity是处于活动状态的(他维护着所有的状态保存着信息,并且依然附着在窗口管理器)。

@ 如果一个activity完全被另一个activity所掩盖那他会处于stop状态。但仍然保存着原来的状态和信息。然而,如果别的地方需要更多的内存而且这个activity仍一直处于隐藏状态,那么系统有可能会杀死他的进程。

如果一个activity是暂停或者停止状态,系统可以清理他们占用的内存,或者调用finish()方法,或者直接结束他的进程。当他再次显示给用户时,会完全的重新运行并且加载以前所存储的信息。

activity状态之间的转换,是通过以前的受保护方法完成的:

void onCreate(Bundle savedInstanceState)

void onStart()

void onRestart()

void onResume()

void onPause()

void onStop()

void onDestroy()

这些都是钩子函数,你可以重写他们,当状态改变时做一些适当的处理。所有的activity在首次运行时必须实现onCreate()方法来初始化安装。activity可以实现onPause()来提交数据改变,然后准备停止与用户的交互。

调用超类

每一个实现的activity生命周期方法都会先调用一下父类的方法,例如:

protected void onPause() { super.onPause(); . . . }

通过这两者比较?,这7个方法定义了一个activity的整个生命周期的方法。你可以实现并且监测这三个嵌套循环:

@ 整个生命周期

调用onCreate()方法和onDestroy()之间称为一个activity的完整的生命周期。activity会在onCreate()里执行所有的初始化安装,在onDestroy()方法里释放所有的剩余资源。例如:一个从网络下载程序的线程,就需要在onCreate()方法里创建,在onDestroy()方法里销毁。

@ 可见生命周期

可见生命周期是从onStart()方法到onStop()方法的时间。这段时间,用户会在屏幕上看到这个activity。尽管他可能不是在最顶层显示,也没有和用户进行任何交互。这两个方法之间,你可以保持需要向用户显示的资源。例如:你可以在onStart()方法时注册一个BroadcastReceiver检测某些变化来改变你的界面,当用户看不到这个activity的界面时可以在onStop()里注销这个BroadcastReceiver。这两个方法可以被调用很多次,在可见和对用户隐藏时,作为候补的activity待命。

@ 前台显示周期

一个activity从onResume()方法指导一个onPause()方法称为前台显示周期。此时他在其他的activity之上显示并且与用户交互。一个activity可以频繁的在这两个方法之间过度,例如:当设备休眠或者另一个新的activity启动时,它会进入onPause()状态,当一个activity运行结束或者新的接收到Intent请求时,activity的onResume()会被调用。因此,这两个方法里的代码量会很少。

下图说明了上面说的几个循环,里面的箭头说明了两个状态之间是否可以相互转换。有色的椭圆是activity主要的几个状态。正方形和长方形代表activity在状态之间转变时我们可以实现的一些回调方法。

《Android Dev Guide》系列教程6:Android生命周期之activity生命周期_第1张图片

注意killable这列,它指明了进程在调用方法返回后是否可以被系统杀死,而不执行其他的代码。onPause(), onStop(), and onDestroy()这三个方法可以,因为onPause方法首先被执行,他是唯一一个一定会被调用的方法当进程被杀死时,但是onStop()和onDestroy()方法不会。因此,你可以在onPause()方法里保存一些连续的数据,例如编辑。

killable这列被标记成no的方法,保护activity防止他们被调用时,被进程杀死。例如:一个activity是处于可被杀死的状态,当activity从onPause()方法跳转到onResume()方法时,在OnPause方法回调之前是不会被杀死的。

正如后面的章节:进程和生命周期,一个没有定义为“killable”的activity仍然可以被系统结束,但这时会发生在特殊情况下,比如没有其他资源时。

保存activity的状态

当系统(而不是用户)关闭一个activity来节省内存时,用户希望再次启动activity时会回到当时的状态。

为了在activity被杀死之前捕获他的状态,你可以实现 onSaveInstanceState()方法,Android会在一个activity将要被关闭时调用这个方法,也就是在onPause()方法之前。他回传递给方法一个Bandle对象,你可以用key-value的方式保存你的数据。当activity再次运行时。这个Bandle对象会传递给onCreate()方法、onStart()方法、onRestoreInstanceState()方法。这几个方法都能重建当时的activity状态。

不像onPause()和刚才讨论的其他几个方法,onSaveInstanceState()和onRestoreInstanceState()方法不是生命周期方法。不是不是总被调用。例如:Android在activity将要被系统销毁之前调用onSaveInstanceState()方法,当activity实例被用户的操作销毁时(例如按下Back键),是不会调用这个方法的。这种情况下没有理由保存他的状态。

Coordinating activities

当一个activity启动了另一个activity,他们都经历了生命周期的转换。一个暂停了或者结束了,其他的activity启动。一种情况你可能需要调节这些activity:

生命周期方法的回调顺序都是定义好的,尤其当两个activity在同一进程下:

1.当前运行的activity的onPause()方法被调用。

2.然后将要运行的activity的onCreate()、onStart()、onResume()方法被依次调用。

3.然后,如果将要运行的activity不太可见,那么onstop()方法会被调用。

更多相关文章

  1. [置顶] 史上最全selector和shape使用方法 Android ListView 列表
  2. Android 获取内外置存储卡方法
  3. Android Junit 单元测试、异步测试方法简介及异步测试框架指南
  4. Android打包成jar文件方法总结
  5. Android 8.0 SystemUI下拉状态栏快捷开关
  6. android的应用程序调用另一个应用程序的方法

随机推荐

  1. Android task和back stack详解四:intent中
  2. android socket链接 NIO非阻塞方式
  3. Android 内核 - 04 Framework 的启动
  4. android蓝牙开发常用类
  5. can't find class TAuthView问题解决
  6. Android程序授权。强悍还是恐怖?
  7. Android指南针app的实现原理总结
  8. Android UI 优化 [ 类别:Layout ] #2
  9. Android的重力传感器(3轴加速度传感器)简单
  10. Android(安卓)基本测试工具的使用