您的位置:首页 > 移动开发 > Android开发

Android中Activity生命周期详解

2013-06-20 01:49 351 查看
本文中先给出一个简单程序,实现两个页面之间相互跳转,分别打印出它们生命周期过程中的状态变化,然后在后面详解Activity生命周期。

第一个Activity:

package com.lovo.activity;

import com.lovo.R;

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

/**
 * 测试Activity的生命周期
 * 
 * @author guyun
 * 
 */
public class LifeCycleActivity extends Activity {

	/**
	 * 第一次启动时调用,可以进行组件的初始化
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.move_main);
		Log.i("LifeCycleActivity.onCreate", "进入onCreate");
		Button btn = (Button) findViewById(R.id.move_main_btn_start);
		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent = new Intent(LifeCycleActivity.this,
						SecondActivity.class);
				startActivity(intent);
			}
		});

	}

	/**
	 * 程序启动时调用
	 */
	@Override
	protected void onStart() {
		super.onStart();
		Log.i("LifeCycleActivity.onStart", "进入onStart");
	}

	/**
	 * 当Activity被恢复时调用,可以进行状态的恢复
	 */
	@Override
	protected void onResume() {
		super.onResume();
		Log.i("LifeCycleActivity.onResume", "进入onResume");
	}

	/**
	 * 当程序被其他程序打断时调用,可以保存相应状态
	 */
	@Override
	protected void onPause() {
		super.onPause();
		Log.i("LifeCycleActivity.onPause", "进入onPause");
	}

	/**
	 * 启动另一个Activity,执行于onPause之后,并且当前Activity完全被遮住时调用
	 */
	@Override
	protected void onStop() {
		super.onStop();
		Log.i("LifeCycleActivity.onStop", "进入onStop");
	}

	/**
	 * 当程序中断结束后,可以重启程序
	 */
	@Override
	protected void onRestart() {
		super.onRestart();
		Log.i("LifeCycleActivity.onRestart", "进入onRestart");
	}

	/**
	 * 当Activity销毁时调用,可以进行清理操作
	 */
	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.i("LifeCycleActivity.onDestroy", "进入onDestroy");
	}
}


第二个Activity:

package com.lovo.activity;

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

import com.lovo.R;

public class SecondActivity extends Activity {
	/**
	 * 第一次启动时调用,可以进行组件的初始化
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.second_main);
		Log.i("SecondActivity.onCreate", "进入onCreate");
		Button btn = (Button) findViewById(R.id.second_main_btn_back);
		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent = new Intent(SecondActivity.this,
						LifeCycleActivity.class);
				startActivity(intent);
				// finish();
			}
		});
	}

	/**
	 * 程序启动时调用
	 */
	@Override
	protected void onStart() {
		super.onStart();
		Log.i("SecondActivity.onStart", "进入onStart");
	}

	/**
	 * 当Activity被恢复时调用,可以进行状态的恢复
	 */
	@Override
	protected void onResume() {
		super.onResume();
		Log.i("SecondActivity.onResume", "进入onResume");
	}

	/**
	 * 当程序被其他程序打断时调用,可以保存相应状态
	 */
	@Override
	protected void onPause() {
		super.onPause();
		Log.i("SecondActivity.onPause", "进入onPause");
	}

	/**
	 * 启动另一个Activity,执行于onPause之后,并且当前Activity完全被遮住时调用
	 */
	@Override
	protected void onStop() {
		super.onStop();
		Log.i("SecondActivity.onStop", "进入onStop");
	}

	/**
	 * 当程序中断结束后,可以重启程序
	 */
	@Override
	protected void onRestart() {
		super.onRestart();
		Log.i("SecondActivity.onRestart", "进入onRestart");
	}

	/**
	 * 当Activity销毁时调用,可以进行清理操作
	 */
	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.i("SecondActivity.onDestroy", "进入onDestroy");
	}
}


两个Activity的布局界面非常简单,本文不再给出。

打印的日志:

一、都是全屏覆盖时:

启动FirstActivity时,打印

FirstActivity ---> 进入onCreate

FirstActivity --->进入onStart

FirstActivity --->进入onResume

从FirstActivity跳到SecondActivity时,打印

FirstActivity --->进入onPause

SecondActivity--->进入onCreate

SecondActivity--->进入onStart

SecondActivity--->进入onResume

FirstActivity --->进入onStop

从SecondActivity返回到FirstActivity时,打印

①若采用new Intent():

SecondActivity--->进入onPause

FirstActivity --->进入onCreate

FirstActivity --->进入onStart

FirstActivity --->进入onResume

SecondActivity--->进入onStop

②若采用finish()结束当前Activity,上一个Activity会自动出现在栈顶,打印

SecondActivity--->进入onPause

FirstActivity--->进入onRestart

FirstActivity --->进入onStart

FirstActivity --->进入onResume

SecondActivity--->进入onStop

SecondActivity--->进入onDestroy

二、现在给AndroidMainfest.xml中的SeconedActivity属性加入android:theme="@android:style/Theme.Dialog",则SeconedActivity将以对话框形式出现,不会对FirstActivity形成遮盖.

这时从FirstActivity 跳转到SecondActivity的状态变化为:

FirstActivity ---> 进入onCreate

FirstActivity --->进入onStart

FirstActivity --->进入onResume

FirstActivity--->进入onPause

SecondActivity--->进入onCreate

SecondActivity--->进入onStart

SecondActivity--->进入onResume

这时区别在于FirstActivity比完全遮盖时少调用了onStop方法.

然后从SecondActivity返回到FirstActivity 时:

①采用new Intent 方式,打印

SecondActivity--->进入onPause

FirstActivity --->进入onStop

FirstActivity ---> 进入onCreate

FirstActivity --->进入onStart

FirstActivity --->进入onResume


SecondActivity--->进入onStop

②采用finish 方式,打印

SecondActivity--->进入onPause

[b]FirstActivity --->进入onResume[/b]

SecondActivity--->进入onStop

SecondActivity--->进入onDestroy

总结几点:

1.onPause 用于由一个Activity转到另一个Activity、设备进入休眠状态(屏幕锁住了)、或者有dialog弹出时。

2.onStop 用于不可见的Activity,即当前的Activity完全被遮住,所以,请注意:有对话框弹出时,这时底下的activity仍然可见,所以此时onStop不会被调用。

故,本文在清单文件中声明SecondActivity以对话框形式显示时,不会对第一个Activity完全覆盖,所以第一个Activity只会执行onPause,而不会执行onStop,锁屏也是一样的效果。

3.调用finish方法是kill掉当前Activity,在执行onStop后,会执行onDestroy,并且这时返回到的第一个Activity不是new出来的,所以不会再调用onCreate。

4.若当前Activity暂停时只执行了onPause,那么暂停结束后,只需执行[b]onResume,比如下列两种情况:[/b]

①当前FirstActivity 跳转出现一个对话框形式的SecondActivity,而SecondActivity自己直接finish即摧毁时

②屏幕锁屏时,然后又打开时
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: