上一篇博客当中,我们知道了android的程序不像java程序有main函数,我们是在onCreate中做了一些初始化和显示界面。这个onCreate就是在程序创建的时候被操作系统调用的。我们这一篇就写一下Activity的生命周期,一个Activity从开始被创建,然后到暂停,再到停止。看一下到底有多少个回调函数,以及什么时候被调用。图1是从官网找到的图。
图1
从图中可以看到有几个函数被调用。
1、 onCreate -- Activity创建的时候被调用
2、 onStart -- Activity可见的时候被调用
3、 onResume --Activity恢复时被调用
4、 onPause --Activity局部可见的时候被调用
5、 onStop -- Activity停止即Activity不可见但并没有被销毁时调用
6、 onRestart -- Activity从停止状态返回到可见状态时被调用
7、 onDestory -- Activity被销毁的时候被调用
为了能够比较直观看到这些函数是在什么时候被调用的。我们建立一个ActivityLifeCycle的工程,具体来操作一下。
public class ActivityLife extends Activity {
final String TAG = "ActivityLife";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity_life);
//打印当前调用的函数
Log.i(TAG, "it's the time calling onCreate");
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
//打印当前调用的函数
Log.i(TAG, "it's the time calling onStart");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
//打印当前调用的函数
Log.i(TAG, "it's the time calling onRestart");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//打印当前调用的函数
Log.i(TAG, "it's the time calling onResume");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
//打印当前调用的函数
Log.i(TAG, "it's the time calling onPause");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
//打印当前调用的函数
Log.i(TAG, "it's the time calling onStop");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
//打印当前调用的函数
Log.i(TAG, "it's the time calling onDestroy");
}
}
程序在回调函数里面我们都会打印当前调用的函数是什么。我们就从具体的几个场景来试验一下,这些函数被调用的顺序。
场景一、启动Activity
Logcat打印出来的是:
可以看到,调用次序是onCreate->onStart->onResume
场景二、按返回键退出Activity
Logcat打印出来的是:
可以看到,调用次序是onPause->onStop->onDestroy
场景三、按Home键返回主屏幕
Logcat打印出来的是:
可以看到,调用次序是onPause->onStop
场景四、退回主屏幕之后,再从新启动Activity
Logcat打印出来的是:
可以看到,调用次序是onRestart->onStart->onResume
根据图1和我们做的实验,我们来总结一下这个生命周期。
第一 这个onCreate()是在程序第一次创建的时候调用的。当然也包括这个Activity被销毁之后(调用onDestroy())再创建的时候也会被调用。
第二 我们需要注意的是,生命周期中的回调函数,像是一个链表中的结点,他们是有顺序的,不会从一个结点直接跳到不相邻的结点,不会从onCreate()直接跳到onResume(),而是从onCreate()找到下一个结点onStart()再找到onResume()。
第三 按下Home键,虽然Activity看不见了,但是它并没有调用onDestroy(),也就是说这个Activity并没有被销毁,只是处于停止的状态。
第四 当我们需要处理一些如果应用程序不可见的时候就释放某些资源的时候,比如预览摄像头等,尽量用onPause()和onResum()这两个回掉函数,因为这两个函数一定会被调用,其他不一定被调用。