关于Activity的生命周期:
下面是Activity整个生命周期中,状态发生变化时所回调的方法,它们对应着Activity完整的生命过程。
void onCreate(Bundle savedInstanceState):Activity被创建时回调
void onStart() :在onCreate()或者onRestart()之后被调用,即Activity第一次创建或者从不可见变为可见状态时调用。
void onResume() :恢复到活动状态时回到,在onStart()之后一定会调用该方法。之后该活动就处于活动状态了,处于任务栈的栈顶。
void onPause() :失去焦点,但是仍然部分可见时回调。
void onStop() :Activity变为完全不可见时回调
void onRestart() :Activity重新启动时回调
void onDestroy() :Activity被销毁前回调
上面的7个方法,除了onRestart()之外,在生命周期的图中都是成对出现的。分为三对,也就出现了三种生存期。
从onCreate()到onDestroy(),一个Activity实例经历了创建到销毁的所有过程,被称之为完整生存期。
从onStart()到onStop(),一个Activity实例从可见状态变为不可见状态,被称之为可见生存期。注意,可见并不一定处于栈顶,因而并一定能与用户交互。
从onResume()到onPause(),一个Activity实例经历了从活动状态到暂停状态,这两个方法之间的过程,该Activity实例都处于活动状态,被称之为前台生存期,或者活动状态生存期。
完整生命周期程序演示,参考《第一行代码》
程序有三个Activity:MainActivity是入口,放置两个按钮,分别用于启动另外两个Activity,实现7个生命周期回调方法,分别输出一条运行信息;NormalActivity就是一个普通的Activity;DialogActivity在Manifest.xml中配置了theme属性,使其成为一个对话框样式的Activity,<activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dialog"></activity>。
具体代码:
main_layout.xml:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 5 android:layout_width="match_parent" 6 7 android:layout_height="match_parent" 8 9 android:orientation="vertical" > 10 11 <Button 12 13 android:id="@+id/normal" 14 15 android:layout_width="wrap_content" 16 17 android:layout_height="wrap_content" 18 19 android:text="@string/start_normal_activity"/> 20 21 <Button 22 23 android:id="@+id/dialog" 24 25 android:layout_width="wrap_content" 26 27 android:layout_height="wrap_content" 28 29 android:text="@string/start_dialog_activity"/> 30 31 </LinearLayout>
MainActivity.java:
1 public class MainActivity extends ActionBarActivity implements OnClickListener { 2 3 @Override 4 5 public void onClick(View view) { 6 7 // TODO Auto-generated method stub 8 9 switch (view.getId()) { 10 11 case R.id.normal: 12 13 Intent intent1 = new Intent(this, NormalActivity.class); 14 15 startActivity(intent1); 16 17 break; 18 19 case R.id.dialog: 20 21 Intent intent2 = new Intent(this, DialogActivity.class); 22 23 startActivity(intent2); 24 25 default: 26 27 break; 28 29 } 30 31 } 32 33 @Override 34 35 protected void onCreate(Bundle savedInstanceState) { 36 37 super.onCreate(savedInstanceState); 38 39 setContentView(R.layout.main_layout); 40 41 Log.i("LIFECYCLE","onCreate"); 42 43 Button btnNormal = (Button) findViewById(R.id.normal); 44 45 Button btnDialog = (Button) findViewById(R.id.dialog); 46 47 btnNormal.setOnClickListener(this); 48 49 btnDialog.setOnClickListener(this); 50 51 } 52 53 @Override 54 55 protected void onStop() { 56 57 // TODO Auto-generated method stub 58 59 super.onStop(); 60 61 Log.i("LIFECYCLE","onStop"); 62 63 } 64 65 @Override 66 67 protected void onDestroy() { 68 69 // TODO Auto-generated method stub 70 71 super.onDestroy(); 72 73 Log.i("LIFECYCLE","onDestroy"); 74 75 } 76 77 @Override 78 79 protected void onPause() { 80 81 // TODO Auto-generated method stub 82 83 super.onPause(); 84 85 Log.i("LIFECYCLE","onPause"); 86 87 } 88 89 @Override 90 91 protected void onStart() { 92 93 // TODO Auto-generated method stub 94 95 super.onStart(); 96 97 Log.i("LIFECYCLE","onStart"); 98 99 } 100 101 @Override 102 103 protected void onRestart() { 104 105 // TODO Auto-generated method stub 106 107 super.onRestart(); 108 109 Log.i("LIFECYCLE","onRestart"); 110 111 } 112 113 @Override 114 115 protected void onResume() { 116 117 // TODO Auto-generated method stub 118 119 super.onResume(); 120 121 Log.i("LIFECYCLE","onResume"); 122 123 } 124 125 }
运行信息:
首先启动该应用程序,依次输出:
可见,正如生命周期图中所示,依次调用了onCreate()、onStart()、onResume()。
然后点击第一个按钮,启动那个普通的Activity,依次输出:
可见,当NormalActivity启动时,MainActivity调用onPause()进入暂停状态,由于NormalActivity启动后,MainActivity被NormalActivity完全遮住时,又要调用onStop()进入停止状态。
然后,点击模拟器的返回按钮,依次输出:
可见,由于按下返回键后,NormalActivity被销毁,MainActivity由不可见状态变为可见状态,则依次调用onRestart()、onStart(),又由于MainActivity当前处于任务栈栈顶,所以又调用onResume()进入活动状态。
然后,点击第二个按钮,启动DialogActivity,依次输出:
由于MainActivity仍然有部分可见,只是当前不再处于任务栈栈顶而已,所以调用了onPause()进入暂停状态。
然后,按下模拟器上的返回按钮,依次输出:
DialogActivity被销毁,MainActivity重新回到栈顶,调用onResume()进入活动状态。
然后,再按下模拟器上的返回按钮,依次输出:
MainActivity要被销毁,从活动状态到销毁状态,依次调用了onPause()、onStop()和onDestroy()。
以上就是一个完整的Activity生命周期演示。
此外,由于停止状态和暂停状态的Activity有可能被系统回收资源,当一个Activity从暂停或者停止状态重新回到活动状态时,由于可能已经被回收依次,之前的操作、数据等,如填写了好大一张表单,全都要重新开始,用户体验极差。这时,就要用到涉及Activity实例状态保存的回调函数:
onSaveInstanceState(Bundle bundle):用于在被系统回收之前,将需要保存的一些Activity实例状态信息,重要数据等保存到bundle对象中。当该Activity实例下次被创建时,调用onCreate(Bundle bundle)方法时,这个bundle对象会传递给onCreate()方法,则可以在onCreate方法中,获取到上次保存的数据,进行相应的初始化,恢复工作。