Android Activity生命周期

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的时候一样。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值