学会总结,自己总结的东西才是自己学到的东西

         Activity是android的重头戏,这节我们来讲一讲它的生命周期,好好研究一下它的运作规律。

         我们先来看下android的帮助文档上面是怎么说的:http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

动手学Android之七——Activity生命周期_android开发

 

         我们在MainActivity中写下下面代码:

package com.example.activitylifecircle;

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

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		System.out.println("MainActivity onCreate");
	}
	
	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		System.out.println("MainActivity onStart");
	}
	
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		System.out.println("MainActivity onResume");
	}
	
	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		System.out.println("MainActivity onRestart");
	}
	
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		System.out.println("MainActivity onStop");
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		System.out.println("MainActivity onDestroy");
	}
	
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		System.out.println("MainActivity onPause");
	}
	
}

 

         我们启动程序:

动手学Android之七——Activity生命周期_android应用_02

 

         首先,调用了onCreate、onStart和onResume,然后我的机器锁屏了

动手学Android之七——Activity生命周期_android应用_03

 

这时触发了生命周期函数onPause,接着我又开启机器了

动手学Android之七——Activity生命周期_android开发_04

 

         触发了onResume,我解锁后点击HOME键,这时

动手学Android之七——Activity生命周期_android开发_05

 

         我再点击程序进来:

动手学Android之七——Activity生命周期_android应用_06

 

         然后我点击BACK键退出:

动手学Android之七——Activity生命周期_android开发_07

 

首先,onCreate是Activity第一次启动的时候调用的函数,Activity的处女函数,我们的一些初始化工作,都要放在这个函数中。与之对应的是onDestroy函数,它是Activity死之前调用的函数,调用这个函数之后,Activity就消失了,所以我们有些资源要释放啥的都写在这个函数中。这两个函数是最好理解的。

         下面我们看下onStart,它是一个Activity可见的时候调用的函数,当我们的activity启动时,它就展现在我们眼前,这时候就调用onStart啦,所以onCreate之后会调用onStart。

         好的,下面我们来看下onResume,它是当Activity获得与用户交互的能力的时候调用的,也就是说,你可以点击到这个Activity,它会有反应的时候,调用的onResume。你也可以理解成它在Activity栈顶的时候,发生的调用。这时可能还不是很好理解,但是没关系,等下我们再来深入研究。但是到这里你可以理解为什么onStart之后会有onResume产生了,因为Activity是先可见,然后才可点击的嘛!

         下面看下onPause,这个函数是当系统中另外一个Activity获得焦点的时候(用户点击有反应),当前Activity调用的函数。也可以说我们当前的Activity失去焦点时,调用的函数。为什么我们锁屏的时候会触发这个函数呢?因为锁屏后我们的Activity相当于失去焦点了,所以调用了这个函数。(其实具体原因我也不太清楚,没研究过Android的源码,但是在日程当中,这里要研究下锁屏后发生了什么,留个悬念,作为以后研究源码的动力)。

         下面开锁后调用onResume,这个好理解了。(其实里面的东西还是不好理解,研究源码后再更新吧)

         这时候,我按下HOME键,程序先失去焦点,然后不可见,所以先掉onPause,再调onStop,注意onStop函数是在一个Activity不可见的时候调用的。

         然后我们再点击回来,这时候调用Activity的onRestart,这个函数是用户调用onStop之后,Activity再次可见的时候先调用的,后面的都很好理解啦!

         到此你就很有信心地说,我已经学会Activity的生命周期了,下面我们加点代码,来做个测试,我们在MainActivity中加一个按钮,点击调到OtherActivity,在OtherActivity中也加一个按钮,点击跳回MainActivity。同样我们在OtherActivity中打出生命周期,这个代码我就不贴了,非常简单,对你来说肯定是小菜啦!

         启动Activity的时候还是一样,猜猜当我点击跳转到OtherActivity的时候发生了什么?

动手学Android之七——Activity生命周期_android应用_08

 

         是不是和你猜的完全一样,这里要注意一点,MainActivity的onPause是先调用的,而onStop是后调用的,而且不会调用onDestroy,因为MainActivity没有被销毁,它被压入Activity栈中了。

         我们在点击跳转到MainActivity,这时会发生什么呢?

动手学Android之七——Activity生命周期_android_09

 

         和你猜的一样吧,是的,这时又产生了一个新的MainActivity,这时我们的栈中有3个Activity了哦!这时我们按下返回键,会发生什么呢?

动手学Android之七——Activity生命周期_android应用_10

 

         这个应该很好理解了,返回键按下后,栈顶的MainActivity就销毁了,出现了destroy。再按下返回键呢?

动手学Android之七——Activity生命周期_android开发_11

 

         对称的,在按下返回键退出程序

动手学Android之七——Activity生命周期_android应用_12

 

         如果你理解了以上过程,那么Activity的生命周期你已经掌握得不错了,不过我们还可以加大难度的。

         我们再加一个按钮,让它弹出对话框,我们看看这时会怎样?

public void onClick(View v) {
	// TODO Auto-generated method stub
	new AlertDialog.Builder(MainActivity.this)
		.setTitle("test")
		.setMessage("i am dialog")
		.show();
}

 

         这里用AlertDialog.Builder来创建一个对话框,我们点击这个弹出对话框,看看效果。

         你尝试了吗?结果什么都没有打出来,再点击back键将对话框关掉,也什么都没有打出来,这是因为这里的对话框是系统的对话框,不在我们这个Activity的栈中,对我们没影响,所以没有东西出来。

         我们再加一个按钮,让它弹出对话框风格的Activity,这下就不一样了,先加代码:

首先是怎么让一个Activity变成一个Dialog样式的呢?答案是在AndroidManifest.xml中修改代码,想不到吧?

<activity  
	android:name=".DialogActivity"  
	android:label="@string/app_name" 
	android:theme="@android:style/Theme.Dialog"  
	>   
</activity>

 

         加上一句android:theme="@android:style/Theme.Dialog"就好了。

         其他代码都差不多,大家都会写的,这里就不讲了。

         代码写好后,我点击弹出对话框样式的Activity,这时候会出现什么情况呢?

动手学Android之七——Activity生命周期_android_13

 

         惊讶吗?没有MainActivity onStop了,原因其实很清楚了,因为我们的MainActivity还是可见的,只是被挡住了一部分。

         这时候我们在按下返回键会怎样呢?

动手学Android之七——Activity生命周期_android开发_14

 

         有没有出乎你的意料?onStop和onDestroy总是在后面执行的。

         好了,如果这些你都搞懂了,那么Activity的生命周期你已经掌握得不错了,这里我再说明一点,貌似有些说法是onStop的Activity在系统内存不够的时候可能会被回收,不过我还不知道这种情况怎么模拟出来,有知道的同学可以告诉我下,我毕竟还是自己没有成功的东西不在博客里写。

 

补充:突然意识到自己忘了介绍Activity栈这个概念了,其实很简单,我们打开一个Activity,再点击一个按钮进去另外一个Activity,然后按返回键又回到了第一个Activity,其实android默认是用了栈这样一个数据结构来存储Activity的。当打开一个Activity的时候,第一个Activity被压栈,而跳到第二个Activity的时候,第二个Activity就被压栈,我们显示出来的永远是栈顶的Activity,而当按下返回键的时候,就会有出栈操作,这时候栈顶就是第一个Activity了,所以又显示第一个Activity。

         关于Android管理Activity会有专题讲,这里补充这些知识,希望对理解本讲内容有帮助。