Activity生命周期与启动模式

典型情况下的生命周期

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


activity_lifecycle.png
  • onCreate():表示Activity正在被创建,这是声明周期的第一个方法。在这个方法中可做一些初始化工作。
  • onRestart():表示Activity重新启动。一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart()就会被调用,这种情况是用户行为所导致的,比如用户按Home键切换到桌面或者打开一个新的Activity,这是当前Activity就会暂停,也就是onPauseonStop会执行,接着用户又回到了这个ActivityonRestart()就会执行。
  • onStart():表示Activity在启动,这是Activity已经可见了,但是还没有出现在前台,还无法和用户交互。
  • onResume():表示Activity已经可见,并出现在前台可以进行交互,onRestartonResume都表示可见,但onStartActivity还在后台,onResumeActivity在前台,可以交互。
  • onPause():表示Activity处于暂停状态,不能和用户交互,当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容。
  • onStop():表示Activity处于停止状态,已经不可见,如果 Activity即将被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。
  • onDetory():表示Activity即将被销毁,可以做一些回收工作和资源的释放。

注意:如果系统在紧急情况下必须回收内存,则可能不会调用onStop()onDestroy(),因此,应该在onPause() 向存储设备写入至关重要的持久性数据(例如用户编辑)。但是不能太耗时,因为该方法中的任何阻止过程都会妨碍向下一个 Activity 的转变并拖慢用户体验。


特定情况下Activity生命周期

  • 情况一:创建一个Activity,重写生命周期的各个方法,观察各个方法的执行顺序。(先启动一个界面,然后,按返回键)onCreate-->onStar-->onResume-->onPause-->onStop-->onDestroy

  • 情况二:启动一个界面,按home键,然后,重新启动该界面,再按返回键。
    ①启动一个界面,按homeonCreate-->onStart-->onResume-->onPause-->onStop
    ②重新启动该界面,onRestart-->onStart-->onResume
    ③按返回键,onPause-->onStop-->onDestroy

  • 情况三:启动一个界面,在该界面上点击按钮,启动下一个界面,然后,按返回键,再按返回键。
    ①启动一个界面,在该界面上点击按钮,启动下一个界面
    main onCreate-->main onStart-->main onResume-->main onPause-->Second onCreate-->Second onStart-->Second onResume-->main onStop
    ②按返回键
    Second onPause-->main onRestart-->main onStart-->main onResume-->Second onStop--> Second onDestroy
    ③再按返回键
    main onPause-->main onStop-->main onDestroy

  • 情况四:启动一个界面,在该界面上点击按钮,启动下一个界面(没有完全覆盖第一个界面),然后,按返回键,再按返回键。
    ①启动一个界面,在该界面上点击按钮,启动下一个界面(没有完全覆盖第一个界面)
    main onCreate-->main onStart-->main onResume-->main onPause-->Second onCreate-->Second onStart-->Second onResume
    ②按返回键
    Second onPause-->main onResume--> Second onStop--> Second onDestroy
    ③再按返回键
    main onPause-->main onStop-->main onDestroy


保存 Activity 状态

当系统配置发生改变或优先级高的应用需要内存时,Activity有可能会被销毁,其中onPauseonStoponDestory会被调用,或异常情况下系统会先调用 onSaveInstanceState(),然后再使 Activity销毁。系统会向该方法传递一个Bundle,可以在其中使用putString()putInt() 等方法以名称-值对形式保存有关 Activity 状态的信息。然后,如果系统终止应用进程,并且用户返回Activity,则系统会重建该 Activity,并将Bundle 同时传递给onCreate()onRestoreInstanceState()。可以使用上述任一方法从Bundle 提取保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则Bundle 是空值(如果是首次创建该 Activity,就会出现这种情况)。

restore_instance.png

注意:无法保证系统会在销毁Activity 前调用onSaveInstanceState(),因为存在不需要保存状态的情况(例如用户使用“返回”按钮离开Activity 时,因为用户的行为是在显式关闭 Activity)。如果系统调用 onSaveInstanceState(),它会在调用onStop() 之前,并且可能会在调用onPause() 之前进行调用,(顺序不一定)

不过,我们也要知道不过,即使什么都不做,也不实现 onSaveInstanceState()ActivityonSaveInstanceState()
默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个View 调用相应的 onSaveInstanceState()
方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText 控件保存用户输入的任何文本,CheckBox 控件保存复选框的选中或未选中状态。只需为想要保存其状态的每个控件提供一个唯一的 ID(通过android:id 属性)。如果控件没有 ID,则系统无法保存其状态。


系统配置发生改变后的生命周期

当系统配置发生改变后,Activity实例可以重新创建,也可以不重新创建,如果不想重新创建,可以在清单文件<activity>标签下设置android:configChanges属性,比如不想屏幕方向改变后重新创建,那么就设置android:configChanges="orientation",该属性声明配置将阻止 Activity 重新启动。 Activity 反而会保持运行状态,并且系统会调用其onConfigurationChanged()方法。其中常用的属性有

  • orientation屏幕方向发生了变化 — 用户旋转了设备。
  • screenSize当前可用屏幕尺寸发生了变化。它表示当前可用尺寸相对于当前纵横比的变化,因此会在用户在横向与纵向之间切换时发生变化。 不过,如果您的应用面向 API 级别 12 或更低级别,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重新启动 Activity)。
  • keyboardHidden键盘无障碍功能发生了变化 — 例如,用户显示了硬件键盘。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容