首页 > 代码库 > android之Activity的生命周期

android之Activity的生命周期

1、Activity简介:

Activity可以简单理解为android手机应用程序中的每一个界面,

其有相应的实现Activity类的java类文件(相当于手机界面控制相关逻辑的文件,类似flex页面的脚本文件,或者常见页面形式中的js),

也有响应的布局xml文件,预先设置好响应的布局控件及其大小、颜色等属性,

每一个Activity都需要在AndroidManifest.xml文件中注册,类似于javaweb中servlet,listener需要在web.xml中注册一样。

2、Activity的生命周期图,如下:


简单几个阶段说明:

    1)、比方说打开一个登录Activity,名为LoginActivity,该LoginActivity会先执行onCreate,onStart,onResume方法,完成登录界面的初始化。

    2)、若用户点击返回导航到主菜单,则执行LoginActivity的onPause,OnStop(用户看不到登录界面时执行),OnDestory方法

          onRestart在下面使用案例说明。

3、案例说明:

    简介:总共两个界面,一个主界面,名为TestLifeCycleActivity(需在),一个点击主界面上的按钮转到的子界面,名为TestLifeCycleActivity2,代码及布局文件如下:

TestLifeCycleActivity.java

package com.example.helloworld;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class TestLifeCycleActivity extends Activity {

	private int i = 1;
	private Button test_life_cycle_btn1 = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test_life_cycle);
		
		System.err.println(i + "、" + "TestLifeCycleActivity onCreate");
		i++;
		
		findView();
		test_life_cycle_btn1.setOnClickListener(new OnClickListener() {
			
		Intent intent = new Intent(TestLifeCycleActivity.this,
				TestLifeCycleActivity2.class);

			@Override
			public void onClick(View view) {
				TestLifeCycleActivity.this.startActivity(intent);
			}
		});
	}

	private void findView(){
		test_life_cycle_btn1 = (Button) findViewById(R.id.test_life_cycle_btn1);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		System.err.println(i + "、" + "TestLifeCycleActivity onDestroy");
		i++;
	}

	@Override
	protected void onPause() {
		super.onPause();
		System.err.println(i + "、" + "TestLifeCycleActivity onPause");
		i++;
	}

	@Override
	protected void onRestart() {
		super.onRestart();
		System.err.println(i + "、" + "TestLifeCycleActivity onRestart");
		i++;
	}

	@Override
	protected void onResume() {
		super.onResume();
		System.err.println(i + "、" + "TestLifeCycleActivity onResume");
		i++;
	}

	@Override
	protected void onStart() {
		super.onStart();
		System.err.println(i + "、" + "TestLifeCycleActivity onStart");
		i++;
	}

	@Override
	protected void onStop() {
		super.onStop();
		System.err.println(i + "、" + "TestLifeCycleActivity onStop");
		i++;
	}

}

TestLifeCycleActivity2 .java

package com.example.helloworld;

import android.app.Activity;
import android.os.Bundle;

public class TestLifeCycleActivity2 extends Activity {

	private int i = 1;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test_life_cycle2);
		
		System.err.println(i + "、" + "TestLifeCycleActivity2 onCreate");
		i++;
		
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		System.err.println(i + "、" + "TestLifeCycleActivity2 onDestroy");
		i++;
	}

	@Override
	protected void onPause() {
		super.onPause();
		System.err.println(i + "、" + "TestLifeCycleActivity2 onPause");
		i++;
	}

	@Override
	protected void onRestart() {
		super.onRestart();
		System.err.println(i + "、" + "TestLifeCycleActivity2 onRestart");
		i++;
	}

	@Override
	protected void onResume() {
		super.onResume();
		System.err.println(i + "、" + "TestLifeCycleActivity2 onResume");
		i++;
	}

	@Override
	protected void onStart() {
		super.onStart();
		System.err.println(i + "、" + "TestLifeCycleActivity2 onStart");
		i++;
	}

	@Override
	protected void onStop() {
		super.onStop();
		System.err.println(i + "、" + "TestLifeCycleActivity2 onStop");
		i++;
	}

}

TestLifeCycleActivity布局文件,仅有一个按钮,转到子界面:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
	<Button android:id="@+id/test_life_cycle_btn1"
	    android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:text="测试Activity生命周期"/>
</LinearLayout>


TestLifeCycleActivity2布局文件如下,无内容:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
	
</LinearLayout>

在AndroidManifest.xml中注册主界面与子界面:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloworld"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="10" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.helloworld.TestLifeCycleActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.helloworld.TestLifeCycleActivity2">
        </activity>
    </application>

</manifest>

测试过程1——点击主界面的按钮,转到子界面,然后点击返回导航,回到主界面,各个生命周期的方法执行如下:

05-14 10:54:19.012: W/System.err(1862): 1、TestLifeCycleActivity onCreate
05-14 10:54:19.012: W/System.err(1862): 2、TestLifeCycleActivity onStart
05-14 10:54:19.041: W/System.err(1862): 3、TestLifeCycleActivity onResume     -- 以上三个为主界面的初始化
05-14 10:54:23.481: W/System.err(1862): 4、TestLifeCycleActivity onPause      -- 点击按钮后将要转到子界面,先暂停主界面
05-14 10:54:25.241: W/System.err(1862): 1、TestLifeCycleActivity2 onCreate    
05-14 10:54:25.251: W/System.err(1862): 2、TestLifeCycleActivity2 onStart
05-14 10:54:25.281: W/System.err(1862): 3、TestLifeCycleActivity2 onResume    -- 初始化子界面,此时子界面被渲染,占据屏幕最前端
05-14 10:54:27.551: W/System.err(1862): 5、TestLifeCycleActivity onStop       -- 主界面不可见,执行主界面的stop方法
05-14 10:55:11.742: W/System.err(1862): 4、TestLifeCycleActivity2 onPause     -- 点击返回导航时,暂停子界面
05-14 10:55:11.802: W/System.err(1862): 6、TestLifeCycleActivity onRestart    -- 执行主界面的restart方法
05-14 10:55:11.802: W/System.err(1862): 7、TestLifeCycleActivity onStart      -- 执行主界面的start方法
05-14 10:55:11.813: W/System.err(1862): 8、TestLifeCycleActivity onResume     -- 执行主界面的onResume方法,重新开始渲染主界面,此时主界面在屏幕最前端
05-14 10:55:13.354: W/System.err(1862): 5、TestLifeCycleActivity2 onStop      -- 子界面不可见,执行子界面onStop方法
05-14 10:55:13.362: W/System.err(1862): 6、TestLifeCycleActivity2 onDestroy   -- 销毁子界面

测试过程2——点击主界面的按钮,将要弹出子界面,此时狂点返回导航,直至退出HelloWorld程序,返回到手机,主界面与子界面各个生命周期的方法执行如下:

05-14 10:56:50.281: W/System.err(1862): 1、TestLifeCycleActivity onCreate
05-14 10:56:50.301: W/System.err(1862): 2、TestLifeCycleActivity onStart
05-14 10:56:50.391: W/System.err(1862): 3、TestLifeCycleActivity onResume     -- 主界面初始化渲染
05-14 10:56:55.331: W/System.err(1862): 4、TestLifeCycleActivity onPause      -- 子界面将要占据手机屏幕,暂停主界面
05-14 10:56:56.411: W/System.err(1862): 1、TestLifeCycleActivity2 onCreate    
05-14 10:56:56.421: W/System.err(1862): 2、TestLifeCycleActivity2 onStart
05-14 10:56:56.441: W/System.err(1862): 3、TestLifeCycleActivity2 onResume   -- 子界面渲染
05-14 10:56:58.051: W/System.err(1862): 4、TestLifeCycleActivity2 onPause    -- 主界面将要占据手机屏幕,暂停子界面
05-14 10:56:58.261: W/System.err(1862): 5、TestLifeCycleActivity onResume    -- 用户点击返回导航到主界面,执行主界面OnResume,因为子界面没有来得及占据手机屏幕,所以主界面此时仍然可见,则不会执行其OnStop方法
05-14 10:56:59.111: W/System.err(1862): 5、TestLifeCycleActivity2 onStop     -- 子界面不可见,执行onStop方法
05-14 10:56:59.111: W/System.err(1862): 6、TestLifeCycleActivity2 onDestroy  -- 销毁子界面
05-14 10:56:59.521: W/System.err(1862): 6、TestLifeCycleActivity onPause     -- 用户点击多次返回导航,退回到主界面后,接着退出主界面,到手机桌面,则需暂停主界面
05-14 10:57:04.571: W/System.err(1862): 7、TestLifeCycleActivity onStop      -- 接着主界面不可见,停止主界面
05-14 10:57:04.571: W/System.err(1862): 8、TestLifeCycleActivity onDestroy   -- 接着销毁主界面