生命周期,对于初学者来讲可能比较深奥。在各种面试中,常常会被问到xxx的生命周期是什么样子的,比如:Servlet的生命周期,Spring Bean的生命周期。今天就详细的讲解一下Android Activity 的生命周期。文章主要涉及到如下几个部分:生命周期图,测试代码,结果分析。
1. 生命周期图
官方有提供 Activity的 生命周期图,如下:
从上图可以清晰的看到 Activity 生命周期中涉及到的主要 方法包括: onCreate(),onStart(),onResume(),onPause(),onStop,onDestory()。 除了这一个还有 onRestart()。
前面的六个方法是相互对应的,比如onCreate 和 onDestory。
其中彩色标示的是几个常态:启动,运行,关闭,杀掉进程。
2.测试代码
光看看,永远都是抽象的。对于程序员,可用的代码才是具体的。为了验证上面的周期图和具体是如何转换的,我写了一个测试程序。程序只有两个Activity,他们之间相互切换。在这个过程中涉及到LogCat (android.util.log),测试结果主要是在这里查看的,我用的编程工具是 eclipse。具体代码如下:
LifecycleActivity1.java
package org.wpg.android.lifecycle;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
public class LifecycleActivity1 extends Activity {
/** Called when the activity is first created. */
private static final String TAG = "LifecycleActivity1";
@Override
public void onCreate(Bundle savedInstanceState) {
//打开的时候调用
Log.i(TAG, "Activity1 onCreate called!");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onStart() {
//打开的时候调用
Log.i(TAG, "Activity1 onStart called!");
super.onStart();
}
@Override
protected void onRestart() {
Log.i(TAG, "Activity1 onRestart called!");
super.onRestart();
}
@Override
protected void onResume() {
//打开的时候调用
Log.i(TAG, "Activity1 onResume called!"); //在关闭屏幕开启的时候会调用
super.onResume();
}
@Override
protected void onPause() {
Log.i(TAG, "Activity1 onPause called!"); //当关闭屏幕是调用
super.onPause();
}
@Override
protected void onStop() {
Log.i(TAG, "Activity1 onStop called!");
super.onStop();
}
@Override
protected void onDestroy() {
Log.i(TAG, "Activity1 onDestroy called!");
super.onDestroy();
}
/**当点击屏幕时,进入Activity2*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
Intent intent = new Intent(this, LifecycleActivity2.class);
startActivity(intent);
return super.onCreateOptionsMenu(menu);
}
}
LifecycleActivity2.java
package org.wpg.android.lifecycle;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
public class LifecycleActivity2 extends Activity {
/** Called when the activity is first created. */
private static final String TAG = "LifecycleActivity2";
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "Activity2 onCreate called!");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onStart() {
Log.i(TAG, "Activity2 onStart called!");
super.onStart();
}
@Override
protected void onRestart() {
Log.i(TAG, "Activity2 onRestart called!");
super.onRestart();
}
@Override
protected void onResume() {
Log.i(TAG, "Activity2 onResume called!");
super.onResume();
}
@Override
protected void onPause() {
Log.i(TAG, "Activity2 onPause called!");
super.onPause();
}
@Override
protected void onStop() {
Log.i(TAG, "Activity2 onStop called!");
super.onStop();
}
@Override
protected void onDestroy() {
Log.i(TAG, "Activity2 onDestroy called!");
super.onDestroy();
}
/**当点击屏幕时,进入Activity2*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
Intent intent = new Intent(this, LifecycleActivity1.class);
startActivity(intent);
return super.onCreateOptionsMenu(menu);
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.wpg.android.lifecycle"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app1" >
<activity
android:name=".LifecycleActivity1"
android:label="@string/app1" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".LifecycleActivity2"
android:label="@string/app2" >
</activity>
</application>
</manifest>
代码简单讲解:
代码非常简单,就是写了两个 activity ,覆盖了父类的几个和生命周期有关的方法,和一个主配置文件。
public boolean onCreateOptionsMenu(Menu menu) {
Intent intent = new Intent(this, LifecycleActivity1.class);
startActivity(intent);
return super.onCreateOptionsMenu(menu);
}
这个代码主要是实现,在点击手机的菜单键的时候实现 activity的切换。
3.分析
具体的测试过程以及结果如下:
a.打开应用:onCreate-》onStart-》 onResume ,在开始的时候这三个方法都会调用。
b.从第一个activity切换到第二个:先会 onPause第一个,然后onCreate-》onStart-》 onResume,最后在onStop
c.从第二个切换到第一个:内容与上一步相同
d.按手机的回退(back)键:先onPause 第一个,然后 onRestart-》 onStart-》 onResume ,然后onStop-》 onDestroy 第二个
e.按 home 键:会调用 onPause 和 onStop
f.再安home 键 重新选择程序进入:onRestart-》onStart-》onResume
g.最终退出:onPause-》 onStop》onDestroy
** e~f 不论当前状态时第一个activity 或者第二个 运行的结果都是一样的。
打开应用是显示的日志如下:
04-07 12:09:12.510: I/LifecycleActivity1(12228): Activity1 onCreate called! 04-07 12:09:12.540: I/LifecycleActivity1(12228): Activity1 onStart called! 04-07 12:09:12.540: I/LifecycleActivity1(12228): Activity1 onResume called!
从第一个activity切换到第二个:
04-07 12:12:48.800: I/LifecycleActivity1(12228): Activity1 onPause called! 04-07 12:12:48.820: I/LifecycleActivity2(12228): Activity2 onCreate called! 04-07 12:12:48.830: I/LifecycleActivity2(12228): Activity2 onStart called! 04-07 12:12:48.830: I/LifecycleActivity2(12228): Activity2 onResume called! 04-07 12:12:49.060: I/LifecycleActivity1(12228): Activity1 onStop called!
从第二个切换到第一个:
04-07 12:14:03.020: I/LifecycleActivity2(12228): Activity2 onPause called! 04-07 12:14:03.040: I/LifecycleActivity1(12228): Activity1 onCreate called! 04-07 12:14:03.050: I/LifecycleActivity1(12228): Activity1 onStart called! 04-07 12:14:03.050: I/LifecycleActivity1(12228): Activity1 onResume called! 04-07 12:14:03.290: I/LifecycleActivity2(12228): Activity2 onStop called!
按手机的回退(back)键:
04-07 12:14:56.740: I/LifecycleActivity1(12228): Activity1 onPause called! 04-07 12:14:56.780: I/LifecycleActivity2(12228): Activity2 onRestart called! 04-07 12:14:56.780: I/LifecycleActivity2(12228): Activity2 onStart called! 04-07 12:14:56.790: I/LifecycleActivity2(12228): Activity2 onResume called! 04-07 12:14:57.030: I/LifecycleActivity1(12228): Activity1 onStop called! 04-07 12:14:57.030: I/LifecycleActivity1(12228): Activity1 onDestroy called!
按 home 键:
04-07 12:16:12.730: I/LifecycleActivity2(12228): Activity2 onPause called! 04-07 12:16:12.950: I/LifecycleActivity2(12228): Activity2 onStop called!
再安home 键 重新选择程序进入:
04-07 12:17:25.870: I/LifecycleActivity2(12228): Activity2 onRestart called! 04-07 12:17:25.870: I/LifecycleActivity2(12228): Activity2 onStart called! 04-07 12:17:25.870: I/LifecycleActivity2(12228): Activity2 onResume called!
最终退出:
04-07 12:20:45.170: I/LifecycleActivity1(12228): Activity1 onPause called! 04-07 12:20:45.380: I/LifecycleActivity1(12228): Activity1 onStop called! 04-07 12:20:45.380: I/LifecycleActivity1(12228): Activity1 onDestroy called!
关闭显示器和打开显示器也会调用相应的方法:
onPause 和 OnResume
结论:
明白了生命周期中的各个方法的执行时机,其实就相当于明白了它的生命周期。在实际开发中可以根据自己的需要,在对应 的方法里面添加相应的内容,关于这方面的技巧就由大家自己摸索,不在这里多说了。