Activity详解——Activity生命周期整理

常见的各个生命周期介绍

onCreate()和onDestroy()
  • onCreate:表示Activity正在创建,是Activity生命周期的第一个方法。在这个方法中我们可以做一些初始化工作。比如加载布局资源,初始化数据等。
  • onDestroy:表示Activity即将被销毁,是Activity生命周期中的最后一个回调。我们一般在这里做一些回收工作和最终的资源释放
onStart()和onStop()
  • onStart:表示Activity正在被启动,即将开始。这时Activity已经是可见的,但是还没完全出现在前台,是不可交互的。或者可以理解为Activity已经在内存中绘制出来了,但是在界面上我们还看不到。
  • onStop:表示Activity即将停止,可以做一些轻量级的资源回收工作,注意耗时不能太长。
onResume()和onPause()
  • onResume:Activity已经可以被用户观察到,也可以和用户进行交互。这个和onStart状态相比Activity不只是可见的,而且是可交互的。
  • onPause:Activity正在停止,正常情款下下一个回调会是onStop。如果这个时候再回到当前Activity(比如singleTop模式时候自身启动自身),那么onResume会被调用。在这个方法中不宜进行耗时较长的操作,因为是此方法执行完后才回执行新页面的onResume所以耗时方法会让新页面显得卡顿
onNewIntent()

之前打开过得且还没有被销毁的Activity(既处于onPauseonStop状态),再次通过startActivity方式启动时候,会先调用该方法,然后在调用onResume。这种情况在Activity的默认启动方式时候不会出现。而在另外三种启动模式时候会出现。

在此方法中需要更新intent的值,否则intent的取值会一直是最开始启动该Activityintent值。

onSaveInstanceState()和onRestoreInstanceState()
  • onSaveInstanceState:在Activity被异常结束时候,会先调用这个方法,然后在调用onDestory()方法,在这个方法中可以做一些数据保存的逻辑,以方便Activity恢复时候进行必要数据的恢复。在这个方法中系统已经做了一定的数据保存工作,例如文本框用户输入的数据、ListView滚动的位置等,具体的实现可以查看每个View源码中的同名方法。
  • onRestoreInstanceState:在Activity从异常状态恢复时候,会在onCreate()之后调用,用来恢复onSaveInstanceState()方法中保存的数据

正常情况生命周期变换

Activity的主要生命周期间的切换模式可以用如下图所示的流程图来概括:

生命周期流程图

然后我们在来分情况说明下Activity在各个状态下的生命周期调用逻辑:

  • 正常启动一个Activity:onCreate()—>onStart()—>onResume()
  • 按返回键返回finish一个Activity:onPause()—>onStop()—>onDestroy()
  • Activity显示是按home键:onPause()—>onStop()
  • 从home回到刚才的Activity:onRestart()—>onStart()—>onResume()
  • 从A跳转到B(A、B均为默认模式Activity):A的onPause()—>B的onCreate()—>B的onStart()—>B的onResume()—>A的onStop()
  • 从B返回到A:B的onPause()—>A的onRestart()—>A的onStart()—>A的onResume()—>B的onStop()—>B的onDestory()
  • 锁屏:onPause()—>onStop()
  • 解锁:onRestart()—>onStart()—>onResume()

异常情况下的生命周期变换

  • 异常结束包括Activity的状态改变和内存不足Activity被回收的情况。两种情况下的生命周期都遵循下面的情况。

  • Activity被异常结束:onPause()/onSaveInstanceState()—>onStop()—>onDestroy其中onPauseonSaveInstanceState没有固定的调用顺序

  • Activity从异常状态恢复:onCreate()—>onStart()—>onRestoreInstanceState()—>onResume()

其他启动模式下的生命周期变换

  • singleTop:如果A设置为singleTop,然后A启动自身时候生命周期是onPause()—>onNewInntent()—>onResume()
  • singleTask:第一次启动时候,和正常Activity启动的方式一样,当再次启动该Activity时候,生命周期是:上个Activity的onPause()—>onRestart()—>onStart()—>onResume()—>上个Activity的onStop()—>上个Activity的onDestory()
  • singleInstance:和singleTask的生命周期方式一致。

其他启动模式下的生命周期变换

  • singleTop:如果A设置为singleTop,然后A启动自身时候生命周期是onPause()—>onNewInntent()—>onResume()
  • singleTask:第一次启动时候,和正常Activity启动的方式一样,当再次启动该Activity时候,生命周期是:上个Activity的onPause()—>onRestart()—>onStart()—>onResume()—>上个Activity的onStop()—>上个Activity的onDestory()
  • singleInstance:和singleTask的生命周期方式一致。

各种生命周期适合进行的操作总结

  • onCreate:正常情况下,该方法只会执行一次。鉴于这种情况,在Activity生命周期内,只需要初始化一次的变量可以在这个方法中初始化。比如findViewById。

  • onStart:只有当Activity有不可见变为可见才回执行一次。由部分可见到完全可见不执行,比如Activityactivity开启了另一个不完全覆盖的activity B,而再次关闭这个B的时候,将不会执行这个方法,但是会执行onResume。所以适合做如下操作:

    • 播放一些在半覆盖情况下需要播放的动画
    • 部分控件的初始化操作,例如GPS
  • onResume:在activity获得焦点的时候执行,之后用户就可以和activity进行交互了,所以适合如下操作:

    • 与交互强相关的资源初始化,例如某些交互性较强的动画(比如下载进度)
    • 对相机资源的使用。
  • onPause:当系统调用此方法是,意味着Activity处于部分可见状态,也意味着用户正在离开这个Activity,通常应该在onPause()回调方法里面做以下事情:

    • 停止动画等浪费cpu资源的操作
    • 释放系统资源,比如BroadcastRecceivers、相机等
    • 注意此处不宜执行耗时过长的动作,例如保存较大的数据到本地、持久化一些统计信息等。这样将会拉长onPause的时间,从而影响下一个Activity的启动
  • onStop:在onStop中,可以执行一些较为耗时的操作,例如:

    • 保存文本到本地
    • 对一些调用频率较少的广播进行注销等操作。
    • 对在onStart注册的资源进行释放等
  • onDestory:activity在销毁前会执行的生命周期方法,这个方法执行后,activity就可能会被回收了。在onDestory中可以释放一些变量,特别是在onCreate中初始化,行进在整个生命周期内的变量

    例如:bitmap,bitmap的回收一直是android的一大问题,他的反复创建又比较耗费性能,如果在onStart中来创建,在onStop中来回收也不理想,如果这个页面需要经常切换,反而造成内存抖动,这种情况下,可以选择一直持有,在onDestroy中调用bitmap的recycle方法来回收。

  • 总结:在onResume进行获取的资源适合在onPause中释放,这对方法中不适合耗时太长的方法。在onStart申请的资源对应的在onStop中释放,可以进行一些比较耗时的操作。onCreate和onDestroy中适合进行一些需要Activity长时间持有的资源的获取与回收,因为这俩方法在Activity的生命周期中只会调用一次。

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

推荐阅读更多精彩内容

  • 【Android Activity】 什么是 Activity? 四大组件之一,通常一个用户交互界面对应一个 ac...
    Rtia阅读 3,794评论 3 18
  • 启动与销毁Activity 不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对...
    安卓Boy阅读 1,749评论 3 5
  • 启动与销毁Activity 不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对...
    mouekz阅读 641评论 0 0
  • 说起Activity大家都不陌生,它主要是跟用户去打交道,其实,它并不仅仅将视图显示给用户,它的背后隐藏的很大的知...
    ReturnYHH阅读 792评论 0 5
  • 打开简书页面,看到在简书上有消息提示,于是赶紧的打开看,这已是一个习惯的行为。 当完成一篇文章的创...
    Sencer阅读 342评论 0 1