Activity生命周期

作者: Shingoooooo | 来源:发表于2016-10-08 15:17 被阅读66次

    一、Activity的四种状态

    Activity最大的特点是拥有多种状态,可以在多种状态之间切换,以此来控制自己的生命周期。
    大致有以下四种状态:

    • Active/Running:这时Activity位于前台,处于Activity栈的最顶层,可以与用户进行交互,并可以获得焦点。
    • Paused:这时Activity失去焦点,Activity栈顶被一个新的非全屏的Activity或者透明的Activity占据,意思就是此Activity还是可见的,但它失去了与用户交互的能力,但所有状态信息、成员变量还都存在。一般情况下不会被系统回收。
    • Stopped:这时Activity完全被另外一个Activity覆盖,变得不可见,失去焦点。但依然保持所有状态信息和成员变量。
    • Killed:这时Activity被系统回收掉或者该Activity从来没有创建过。

    二、Activity的生命周期

    在正常情况下,Activity会经历如下生命周期:

    注意:正常情况是指有用户参与的情况下,Activity所经历的生命周期的改变;而异常情况是指Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁等情况。

    • onCreate:这是生命周期的第一个方法,表示Activity正在被创建。此方法只会被调用一次,我们可以在这个方法中做一些初始化工作,比如调用setContentView去加载布局,初始化Activity数据等。
    • onRestart:表示Activity正在重新启动。当当前Activity从不可见重新变为可见状态时会被调用。而这种情况一般是用户导致的,比如用户按Home键切换到桌面或者打开了一个新的Activity,这时当前的Activity就会暂停,接着再回到这个Activity时,就会调用onRestart。
    • onStart:表示Activity正在被启动。这时Activity已经显示出来,但还没有出现在前台(所以用户还看不见),无法与用户交互。
    • onResume:表示Activity已经可见,并且出现在前台并开始活动。这个状态也就是前面的Active/Running状态,此时的Activity处于Activity栈的栈顶,可以和用户进行交互。
    • onPause:表示Activity正在停止。当Activity的一部分被挡住的时候进入这个状态,此时的Activity不会接收用户输入,一般来说紧接着onStop会被调用。此时我们可做一些数据存储、停止动画等轻量级的工作,不能太耗时,否则会影响新Activity的显示。注意:onPause必须先执行完,新Activity的onResume才会执行
    • onStop:表示Activity即将停止。当Activity完全被覆盖时进入这个状态,此时Activity不可见,仅在后台运行。我们同样只能做一些轻量级的回收工作。
    • onDestrory:这时生命周期的最后一个方法,表示Activity即将被销毁。此方法也只会被调用一次。在这里,我们可以做一些回收工作和最终的资源释放。

    以下是Google官方给出的Activity lifecycle图:


    activity_lifecycle.png

    三、生命周期例程分析

    下面通过一个实例对Activity生命周期进行详解:

    • 首先,定义一个只含有两个Button的XML布局文件,一个叫start SecondActivity,即启动SecondActivity,另一个叫quit,即退出当前Activity。
      布局如下:

      布局.png
    • 接着,在MainActivity中加载布局,定义两个Button的事件监听器后,重写生命周期的七种方法,在每个方法中使用Log打印相应的方法名。部分代码如下:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(TAG,"onCreate");
    

    定义quit按钮的事件监听器:

    finish.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MainActivity.this.finish();
        }
    });
    

    重写方法:

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG,"onStart");
    }
    
    • 最后,在SecondActivity中简单布局一个TextView,输出“SecondActivity”。

    我们将MainActivity设置为程序的入口,当程序启动时会自动执行该Activity,此时观察Logcat的输出,有:

    第一次启动.png

    然后,按一下start SecondActivity按钮,观察Logcat的输出,有:

    start secondactivity.png

    接着,按一下back返回键回到MainActivity,观察Logcat的输出,有:

    return.png

    继续,按一下HOME键,观察Logcat的输出,有:


    HOME.png

    再重新打开程序,观察Logcat的输出,有:


    restart.png

    接下来,按一下back返回键返回到桌面,观察Logcat的输出,有:


    back.png

    最后,按一下quit按钮,观察Logcat的输出,有:

    quit.png

    四、总结

    从事例角度:
    • 对一个特定的Activity来说,第一次启动的回调顺序为:onCreate-->onStart-->onResume(图1)。当进入到resumed的状态时,就是用户能够看到的界面,能够与用户进行交互的界面。
    • 当用户打开新的Activity或者切换到桌面时,回调如下:onPause-->onStop(图2和图4)。这里有一种特殊情况,如果新Activity采用了透明主题,那么当前Activity不会回调onStop
    • 当用户再次回到原Activity时,回调如下:onRestart-->onStart-->onResume(图5)。
    • 当用户按back键回退到桌面时,回调如下:onPause-->onStop-->onDestory(图6)。
    从配对角度:
    • 从整个生命周期来说,onCreateonDestory是配对的,分别标识着Activity的创建和销毁,并且只可能有一次调用。
    • 从Activity是否可见来说,onStartonStop是配对的,随着用户操作,这两个方法可能被多次调用。
    • 从Activity是否在前台来说,onResumeonPause是配对的,随着用户操作,这两个方法可能被多次调用。

    参考资料:
    《疯狂Android讲义》第三版
    《Android开发艺术探索》
    《Android群英传》

    相关文章

      网友评论

        本文标题:Activity生命周期

        本文链接:https://www.haomeiwen.com/subject/wmvuyttx.html