Activity生命周期

一、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群英传》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容