应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束 实例被销毁。在这期间,他们有时候处于激活状态,有时候处于非激活状态;对于活动,对用户有时候可见,有时候不可见。组件生命周期将讨论活动、服务、广播 接收者的生命周期——包括在生命周期中他们可能的状态、通知状态改变的方法、及这些状态的组件寄宿的进程被终结和实例被销毁的可能性。
本文主要讨论活动的生命周期及他们可能的状态、通知状态改变的方法。分为以下三部分:
一个活动有三个基本状态:
如果一个活动被暂停或停止,系统可以将它从内存移除,通过要求它结束(通过调用它的finish() 方法),或简单地杀掉它的进程。当它再次显示给用户时,必须要完全重新启动和恢复到之前的状态。随着活动从一个状态转为另一个状态,通过调用下面的受保护的方法通知该改变:
所有这些方法都是钩子,你可以重写当状态改变时做适当的工作。所有的活动必须要实现onCreate() 去做一些初始化的设置,当对象第一次实例化的时候。很多活动也会实现onPause() 去提交数据修改或准备停止与用户交互。
将他们合并在一起,这七个方法定义了活动的整个生命周期。有三个嵌套的循环,你可以通过这七个方法监视:
下面这个图解释了这三个循环和状态之间状态的可能路径。着色的椭圆表示活动的主要状态,矩形表示当活动在状态之间转换时你可以执行的回调方法。
图1、活动生命周期(来源:Android SDK)
下面的表格对每个方法更详细的描述和在活动的整个生命周期中的定位。
注意上面表格的Killable 列,它表示当方法返回时没有执行活动的其它代码,系统是否能杀死活动寄宿的进程。三个方法(onPause() 、onStop() 、onDestroy() )标记为Yes 。因为onPause() 是唯一一个保证在进程被杀之前会调用的,因此你应该使用onPause() 来写任何持久化存储数据。
被标记为No 的方法保护活动寄宿的进程在他们调用的时候不会被杀掉。因此活动是可杀掉状态,例如onPause() 返回到onResume() 调用期间。直到onPause() 再次返回,活动是不可杀掉的。其实,没有标记为Killable 的活动也是可以系统被杀掉的,不过这仅仅发生在极端困难的情况下,没有有任何其他资源可用。
当系统而不是用户关闭一个活动来节省内存时,用户可能希望返回到活动且是它之前的状态。为了获得活动被杀之前的状态,你可以执行活动的onSaveInstanceState() 方法。Android在活动容易被销毁前调用这个方法,也就是调用onPause() 之前。该方法的参数是一个Bundle 对象,在这个对象你可以以名值对记录活动的动态状态。当活动再次启动时,Bundle 同时被传递到onCreate() 和调用onCreate() 之后的方法,onRestoreInstanceState() ,因此使用一个或两个可以重新创建捕获的状态。
因为onSaveInstanceState() 方法不总是被调用,你应该仅使用onSaveInstanceState() 它来记录活动的临时状态,而不是持久的数据。应该使用onPause() 来存储持久数据。
当一个活动启动另一个活动,他们都经历生命周期转换。一个暂停或许是停止,然而另一个启动。有时,你可能需要协调这些活动。生命周期的回调顺序是明确界定的,特别是当这两个活动在同一个进程中:
修正 :第一节—— 活动生命周期中的表格第一、二行中的第二列(description)中的onRestart()应该为onStart()。
1000多的点击,居然没有人发现这个错误,看了大家根本就没认真看或者说根本没有静心看园子里的任何博文,心痛!还是水帖比较受欢迎。
下面是一个简单的例子:
package com.android.lifetest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class AndroidLifeActivity extends Activity { private String TAGS = "life"; private Button clickme; private Button one; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.d(TAGS, "onCreate..."); clickme = (Button)findViewById(R.id.clickme); one = (Button)findViewById(R.id.oneactivity); clickme.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(AndroidLifeActivity.this, Another.class); startActivity(intent); } }); one.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(AndroidLifeActivity.this, One.class); startActivity(intent); } }); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.d(TAGS, "onDestroy..."); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Log.d(TAGS, "onPause..."); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); Log.d(TAGS, "onRestart..."); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.d(TAGS, "onResume..."); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.d(TAGS, "onStart..."); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.d(TAGS, "onStop..."); } }
运行效果如下:
1、当用户首次运行时,打印如下,onCreate方法其实只调用一次
2、当用户点击第一个按钮时,弹出一个Dialog形式的Activity,这时只调用onPause方法
3、用户点击back键返回,恢复来前一个
4、用户锁屏后
5、用户解锁屏
6、用户点击第二个按钮,进入另一个视图
转自:http://www.cnblogs.com/skynet/archive/2010/05/05/1727645.html