[Android编程心得]Activity的生命周期函数
在使用Eclipse添加一个新的Activity时,系统会自动生成OnCreate()函数,而其他生命周期函数,例如OnStart() OnReSume()等它是不负责自动生成的,也因为这样,就会被很多开发者忽略,从而产生一些意想不到的错误。
在之前翻译的文章中,分别讲过各个生命周期函数的用法,这里整理一下。
下面是之前翻译的官方文档,里面包含了更详细的实例。
[Andriod官方训练教程]管理Activity的生命活动之开始一个Activity
[Andriod官方训练教程]管理Activity的生命活动之暂停和恢复一个Activity
[Andriod官方训练教程]管理Activity的生命活动之停止和重启一个Activity
[Andriod官方训练教程]管理Activity的生命活动之重新创建一个Activity
总体来说,一个Activity只有3种静止状态(其他状态都是瞬时的):
onPause(),然后activity将在Paused状态等候。之后用户再次返回到activity(例如在蓝牙开启对话框出现后,选择了“是”或“否”,该对话框就会自动消失)时,系统将调用onResume()。
一旦activity被完全阻塞并且不再可见,它将会停止(Stopped状态)。了解系统何时停止(Stop)和重启(ReStart)你的activity也是很重要的,这确保你的用户可以感到你的app总是活跃的而不是丢失了他们的进程。在以下几种情况下你的activity需要被停止或是重启(请注意上图中需要调用的各种方法):
当系统开始停止你的activity时,它调用onSaveInstanceState() ,因此万一Activity实例必须被重建时你可以指明你想抱保存的额外状态。如果activity被销毁并且一个相同的实例必须被重建,系统将(1)中定义的状态传递给onCreate() 方法 (2) 以及onRestoreInstanceState()方法 (3)。有一些情况下你的activity因为正常的app行为而被销毁,例如当用户按下返回按钮或者你的activity调用了
finish()预示着它本身的销毁。当你的activity因为用户按下返回按钮而自己销毁时,系统中的Activity实例会永久消失,因为这样的行为表明activity不再被需要了。
onSaveInstanceState(Bundle savedInstanceState)方法
当你的activity要停止时,系统调用onSaveInstanceState(),因此你的activity可以用一个键-值对集合保存状态信息。这个方法的默认实现保存了activity中view的层级结构信息,例如EditText中的文本或是ListView中的滚动位置。
为了保存你的activity中额外的信息,你必须实现onSaveInstanceState(),然后向Bundle对象中添加键-值对。警告:永远调用onSaveInstanceState()的父类实现,因为默认实现可以保存view层级结构的状态。
onRestoreInstanceState(Bundle savedInstanceState)方法
当你的activity之前被销毁再被重建时,你可以从Bundle中恢复你保存的状态。onCreate() 和onRestoreInstanceState()回调函数都接收包含了相同的状态信息的Bundle对象。因为onCreate()方法在创建一个新的实例以及重建一个先前的实例都会被调用,在你试图读一个Bundle之前你必须检查它的状态是否是null。如果它是null,那么系统将会创建一个新的activity实例,而不是重新载入之前被销毁的一个。你可以在onCreate()中重载相同的状态数据。
你也可能选择去实现onRestoreInstanceState()(系统在onStart()方法后调用)而不是在onCreate()重新载入状态。系统仅在有某个保存的状态需要被重载时才调用onRestoreInstanceState()。
警告:永远先调用onRestoreInstanceState()的父类实现,因为默认实现可以重新载入view层级结构的状态。