Activity是一个应用组件,用户可以根据其提供的界面进行一系列操作,如打电话,拍照片等等。每个Activity都会获得一个用于绘制用户界面的窗口,窗口通常充满屏幕但也有可能小于屏幕并浮动在其他窗口之上。一个应用程序通常都是由一系列松散的Activity组成。一般会指定其中的一个Activity为主Acitivity,用于充当程序的入口。Activity共有七级生命周期,下面先附上一张周期图:
其实由图我们可以知道,当启动一个Activity的时候,程序首先进入的是onCreate方法,一般来说我们都是在onCreate方法中调用setContentView方法来引入一个布局,(虽然说在其他的生命周期中我们调用此方法也可以引入布局,并且也可以不重写onCreate方法,但是不推荐),当Activity第一次被创建的时候,activity中的复写方法第一个运行的是onCreate,但是由于activity也是一个java类,所有其中当然也就有构造方法,静态代码快之类的了。那么他们之间的运行顺序又是如何的呢?我们来看一下:
{
Log.i("js","我是代码块");
}
static {
Log.i("js","我是静态代码块");
}
public MainActivity(){
Log.i("js","我是构造方法");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i("js","onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
Log.i("js","onStart");
super.onStart();
}
@Override
protected void onStop() {
Log.i("js","onStop");
super.onStop();
}
@Override
protected void onPause() {
Log.i("js","onPause");
super.onPause();
}
@Override
protected void onResume() {
Log.i("js","onPause");
super.onResume();
}
@Override
protected void onRestart() {
Log.i("js","onRestart");
super.onRestart();
}
@Override
protected void onDestroy() {
Log.i("js","onDestroy");
super.onDestroy();
}
内容很简单,就是简单的输出一下log,检查下他们的运行顺序如何,下面是运行情况
我们可以发现,静态代码块是最先运行的,依次是代码块和构造方法,最后才是Activity中的方法。通过时间我们可以看到几乎是在同一刻onPause和onStop都同时出现了。这是为什么呢,因为我在运行的时候,屏幕是闭屏的,也就是接下来我要讲的Activity的生命周期了。先说下activity中的几个复写方法的执行顺序,同样是通过运行图来表明:
通过上图,我们看到了有几个方法重复出现了。这是为什么呢?要解释清除这个,那我们就不得不说一下,这些方法都是在哪一阶段会被调用的了。onCreate我们都知道,当Activity被创建的时候调用,我们可以在该方法中调用setContentView方法来创建布局,以便跟用户进行交互。当该Activity是第一次被创建的时候,onStart会紧接到onCreate后面被调用,但是当不是第一次进入该activity的时候,onStart则会在onRestart方法后面被调用。当一个activity被其他界面覆盖但是没有完全覆盖的时候,那么该activity的onPause方法将被调用,但是该activity的对象跟窗口管理器仍然存在内存中,但是当内存紧张的时候,有可能被系统杀死进而回收内存,当被完全覆盖且不可见的时候,该activity的onStop方法将被调用,但是该activity的对象仍然存在系统的回退栈中,不过窗口管理器则被回收,这中情况也有可能被系统杀死进而回收内存。当用户一直按返回键退出程序,或者调用finish退出程序后,onDestroy方法将会被调用。
所以,通过上图,我们可以知道,当我第一次进入到activity的时候,程序顺序执行直到onStop,但是由于我的程序并没有退出,所有并没有调用onDestroy,当我打开屏幕后,程序重新启动调用onRestart再继续运行直到onResume,当我按返回键退出后,程序顺序执行onPause,onStop,onDestroy.
ps:当程序被调用onPause后,如果我们不能保证能够多长时间后,再次回到该activity,有需要的话,则最好保存当前的状态跟一些数据,在onSaveInstanceState()方法中,该方法会在onStop之前调用,但是不能保证是在onPause之前还是之后调用。当该activity被销毁后,如果再次进入该activity则是程序重新创建的,这时,我们就可以把在onSaveInstanceState()方法中的bundle中保存数据,在onCreate方法中取出来,或者在onRestoreInstanceState方法中取出来。如果没有数据,bundle默认为null,就像第一次创建activity的时候一样。