Activity的生命周期

来源:互联网 发布:自学优化网络工程师 编辑:程序博客网 时间:2024/06/11 18:59

Activity的生命周期

近期回顾了一下Activity的基础知识,对于Activity的生命周期有了更清晰的了解,在这里和大家分享一下,同时也算是自己的一个笔记。

  • Activity形态
  • 正常情况下的生命周期
  • 异常情况下的生命周期

Activity形态

首先我们来看一下这张经典的生命周期图,Activity存在多种形态,通过不同形态之间的切换,就可以控制Activity的生命周期。

这里写图片描述

通常情况下,一个Activity会经历以下几种方法:

  • onCreate

当 activity 第一次创建时会被调用。在这个方法中你需要完成一些初始化的任务 ,比如加载界面布局、绑定列表的数据等等。

  • onRestart

在 activity 被停止后重新启动时调用。当Activity重不可见重现变为可见状态时调用。

  • onStart

当 activity 对于用户可见前即调用这个方法。这时Activity可见,但是并没有出现在前台,无法和用户进行交互。

  • onResume

在 activity 开始与用户交互前调用该方法。在这时该activity 处于 activity 栈的顶部,并且接受用户的输入。

  • onPause

表示Activity正在停止。在这个方法中可以保存数据 ,停止动画或其它一些耗 CPU 的操作。但是不能执行比较耗时的操作,否则会影响下一个 activity 的呈现。

  • onStop

在 activity 对用户不可见时将调用该方法。可能会因为当前 activity 正在被销毁,或另一个 activity (已经存在的activity 或新的 activity )已经恢复了正准备覆盖它,而调用该方法。

  • onDestroy

在 activity 被销毁前会调用该方法。这是 activity 接收到的最后一个调用。人为调用了 finish 方法,或系统为了保护内存临时释放这个 activity的实例,都会调用该方法。可以在该方法中做一些回收工作和最终资源的释放。

从整个生命周期来看,onCreate和onDestroy,分别表示这Activity的创建和销毁,只可能调用一次。

onStart和onStop,表示Activity是否可见,但此时Activity还未显示到前台,无法与用户进行交互。这两个过程,随着用户的操作或者设备屏幕的点亮或熄灭会可能被多次调用。

onResume和onPause,表示Activity是否在前台,次时Activity可以与用户进行交互。同样,这两个方法也可能会被调用多次。

正常情况下的生命周期

下面我们就结合实例,来演示一下生命周期的几个常见过程的详细情况。我在AS建一个名为
LifeCycleApplication的项目,创建一个名为BaseActivity的Activity,如下:

package com.example.lifecycle.lifecycleapplication;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;/** * Created by Liu on 2016/7/12. */public class BaseActivity extends AppCompatActivity {    protected String Tag = "BaseActivity";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.i(Tag, "onCreate");        int layoutId = getLayoutId();        if (layoutId != -1) {            setContentView(layoutId);        }        initViews();    }    @Override    protected void onStart() {        super.onStart();        Log.i(Tag, "onStart");    }    @Override    protected void onResume() {        super.onResume();        Log.i(Tag, "onResume");    }    @Override    protected void onPause() {        super.onPause();        Log.i(Tag, "onPause");    }    @Override    protected void onStop() {        super.onStop();        Log.i(Tag, "onStop");    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.i(Tag, "onDestroy");    }    @Override    public void finish() {        super.finish();    }    /**     * 内容区域layout id     *     * @return layout id     */    protected int getLayoutId() {        return -1;    }    /**     * 初始化views     */    protected void initViews() {    }}

可以看出,在BaseActivity中打印了Activity的各个生命周期。在项目中,继承BaseActivity创建FirstActivity , SecondActivity, TransparentActivity。通过这几个Activity的跳转,我们来分析一下正常情况下Activity的生命周期。

启动FirstActivity

Activity的启动过程:onCreate—onStart—onResume
这里写图片描述

结束FirstActivity

按下返回键时,Activity弹出栈,程序销毁:onPause—onStop—onDestroy
这里写图片描述

按Home键

按Home键,FirstActivity会停止,进入后台状态:onPause—onStop
这里写图片描述
重新进入,恢复FirstActivity,再次呈现到前台:onStart—onResume
这里写图片描述

FirstActivity启动SecondActivity

Activity A 启动 Activity B,那么A先停止呢还是B先启动?
从下面的log中可以看出,FirstActivity启动SecondActivity,会先调用FirstActivity的onPause,然后执行SecondActivity的启动过程onCreate—onStart—onResume,最后执行FirstActivity的onStop。
所以不要在onPause和onStop(尤其是onPause)中执行耗时的任务,以免影响新Activity的显示。
这里写图片描述

SecondActivity返回FirstActivity

点击SecondActivity的返回按钮,从SecondActivity返回FirstActivity。生命周期和A启动B类似。先执行SecondActivity的onPause,在恢复FirstActivity。
这里写图片描述

FirstActivity启动TransparentActivity(透明主题)

当启动一个新的Activity,而这个Activity的主题又是透明的时候,此时,启动新Activity后,原来的Activity还是可见的,但是不能和用户交互。所以,原来的Activity不会执行onStop方法。
这里写图片描述
从TransparentActivity返回FirstActivity :
这里写图片描述

异常情况下的生命周期

在一些异常情况下,比如当系统配置发生改变,或者系统内存不足时,Activity就可能被杀死。在这些情况下,Activity的生命周期就会略有不同。

资源配置–屏幕旋转

屏幕旋转是资源配置发生改变的典型例子。当屏幕发生旋转时,Activity在默认情况下会被销毁再重建。在这种情况下,如果不做处理,那么原来Activity中的数据就会丢失,这显然不会是很好的用户体验。所以Android系统提供了onSaveInstanceState和onRestoreInstanceState这两个方法保存和恢复Activity的状态。
在ConfigActivity中放置了两个EditText,在Activity中对第一个EditText的数据进行了保存,而对第二个不做处理,当选择屏幕后,可以很清楚的看到两者的不同吧。
这里写图片描述
下图,是屏幕旋转过程中Activity的生命周期。 ononSaveInstanceState在onStop之前调用,保存Activity中的数据,onRestoreInstanceState在onStart之后调用,恢复之前存储的数据。
需要说明是,onSaveInstanceState和onRestoreInstanceState只有在Activity被异常终止是才会被调用,当Activity被正常销毁时,是不会调用上述两种方法的。
这里写图片描述

Activity被系统回收

当系统内存不足时,一些Activity就可能被系统回收,导致被销毁。这种情况下的数据存储和恢复和系统配置改变的情况是一致的。

项目下载地址

0 0
原创粉丝点击