现在的位置: 首页 > 综合 > 正文

细谈Activity生命周期

2014年01月07日 ⁄ 综合 ⁄ 共 2601字 ⁄ 字号 评论关闭

最近在开发一个小小的应用,由于一个Activity里不仅要创建各种各样的类,而且要在恰当的时机释放掉被占用的资源。

由于生命周期方法是被自动调用的

因此,有必要了解Activity的生命周期方法的调用时间和顺序。

下面是一个简单的测试类,利用android.util.Log的静态方法d(debug),i(info),e(error)等可以在LogCat里输出不同类型的日志信息(不同类型以不同的颜色区分)

package com.example.testlifecycle;

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

public class MainActivity extends Activity {

	private static final String TAG = "activity";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.d(TAG, "onCreate");
		setContentView(R.layout.activity_main);
	}

	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);
		Log.d(TAG, "onPostCreate");
	}

	@Override
	protected void onStart() {
		super.onStart();
		Log.d(TAG, "onStart");
	}

	@Override
	protected void onRestart() {
		super.onRestart();
		Log.d(TAG, "onRestart");
	}

	@Override
	protected void onResume() {
		super.onResume();
		Log.d(TAG, "onResume");
	}

	@Override
	protected void onPostResume() {
		super.onPostResume();
		Log.d(TAG, "onPostResume");
	}

	@Override
	protected void onPause() {
		super.onPause();
		Log.d(TAG, "onPause");
	}

	@Override
	protected void onStop() {
		super.onStop();
		Log.d(TAG, "onStop");
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.d(TAG, "onDestroy");
	}

}

类一共有9个方法,分别打印不同的消息。

它们分别是onCreate,onPostCreate,onStart,onRestart,onResume,onPostResume,onDestroy,onPause,onStop   

当启动该该程序时,首先进入该Activity,我们来看下LogCat的输出信息:


由此可知,当打开一个Activity时,调用顺序是:

onCreate->onStart->onPostCreate->onResume->onPostResume

下面分别进行不同的操作:

1.点击Back键(后退键)

从打印信息知道:

调用顺序是: onPause->onStop->onDestroy

2.如果按Home键(像房子的按钮)


可以看出,它和back键的区别是没有调用onDestroy方法

测试完back键和home键(menu键不会调用任何生命周期方法)

下面测试下两个Activity之间跳转:

我在第一个Activity内加了一个按钮,可以跳转到第二个Activity(别忘了注册),第二个Activity的日志输出为了和第一个Activity区别,特意加了一个"2"字(没其他意思,呵呵)

当打开第一个Activity后,点击按钮,进入下一个Activity:


可以看出,跳转到第二个Activity前,先调用了onPause方法,然后和打开第一个Activity一样,分别调用了onCreate->onStart->onPostCreate->onResume->onPostResume

最后!!第一个Activity调用了onStop方法。

下面,我们在点击Back键,返回到第一个Activity:


上面的有点类似,首先第二个Activity调用onPause方法,然后第一个方法会先调用onRestart方法,然后调用onStart方法,接着onResume->onPostResume,最后第二个Activity调用了onStop->onDestroy方法。

以下是我的一些总结:

1 如果用户点击了后退键,除非重写了onBackPressed方法,否则一定会调用onDestroy方法(因为基类Activity对方法的实现是调用finish方法)

    /**
     * Called when the activity has detected the user's press of the back
     * key.  The default implementation simply finishes the current activity,
     * but you can override this to do whatever you want.
     */
    public void onBackPressed() {
        finish();
    }

以上摘自Activity类

2 onCreate方法以及onPostCreate方法有且仅调用一次。

        3 切换到其他Activity时,该Activity会调用onPause,接着另外一个Activity调用一些方法后,会再调用前一个Activity的onStop方法,下一次回到该Activity时,会调用onRestart方法。

4 一个Activity切换到第二个Activity后,前一个Activity被压入栈中。

本来还向测试如果待机会触发什么生命周期方法,结果数据线不见了。。。。

参考网站:http://wsj.wikidot.com/android:1

Over...

抱歉!评论已关闭.