Activity和Fragment的生命周期

Activity和Fragment生命周期有哪些?

activity生命周期

Paste_Image.png

正常生命周期

  1. 正常打开单个Activity,然后退出应用:
    这种情况是最普通的状况,Activity的生命周期会按照上图从上到下的方式走。即:onCreate --> onStart --> onResume --> 运行--> 按返回键结束程序--> onPause-->onStop-->onDestory
  2. 打开一个Activity A,然后再打开另一个Activity B。
    对于A:onCreate --> onStart --> onResume --> A运行 --> A发出打开B的Intent --> onPause-->B可见-->onStop
    此时,会打开B,B同样会经历一个完整的Activity生命周期。等B结束,A再度可见的时候,A会经历:onRestart-->onStart-->onResume

Activity A启动Activity B的日志记录:
Configration:: A onPause
Configration:: B onCreate
Configration:: B onStart
Configration:: B onResume
Configration:: A onStop
Configration:: B onPause
Configration:: B onStop


> 注意:B这个Activity是在A的onPause执行后才变成可见状态的,所以为了不影响B的显示,**最好不要在onPause里执行一些耗时操作**,可以考虑将这些操作放到onStop里,这时B已经可见了。

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1098904-72752dde2a5b2270.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**横竖屏切换时的生命周期**
1. 不设置configChanges时,**横竖屏切换会回调整个生命周期,必然回调的方法是onRestoreInstanceState,而onSaveInstanceState在实际测试中并不保证能够调用**。
2. 无法保证系统会在销毁Activity前调用onSaveInstanceState(只有异常退出时才调用onSaveInstanceState),因为存在不需要保存状态的情况(例如用户使用“返回”按钮离开您的 Activity 时,因为用户的行为是在显式关闭 Activity)。如果调用onSaceInstanceState会在onStop之前调用。
3. 不过,**即使您什么都不做,也不实现 onSaveInstanceState类的onSaveInstanceState默认实现也会恢复部分 Activity 状态**。具体地讲,默认实现会为布局中的每个Viewon的SaveInstanceState()方法,让每个视图都能提供有关自身的应保存信息。
4. 自行处理配置变更可能导致备用资源的使用更为困难,因为系统不会为您自动应用这些资源。 只能在您必须避免 Activity 因配置变更而重启这一万般无奈的情况下,才考虑采用自行处理配置变更这种方法,而且**对于大多数应用并不建议使用此方法**。
5. 从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。因此,在开发针对 API 级别 13 或更高版本的应用时,若要**避免由于设备方向改变而导致运行时重启**(配置该项目后当横竖屏等配置信息发生变化时不会导致Activity重启),则除了 "orientation" 值以外,您还必须添加 "screenSize" 值。 也就是说,您必须声明 **android:configChanges="orientation|screenSize"。**

<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name">

**当设备配置发生变化时会调用此方法**,从Configuration对象中读取相应的配置信息

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
    Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}

}


###保存配置
有些设备配置可能会在运行时发生变化(例如屏幕方向、键盘可用性及语言)。**发生这种变化时,Android 会重启正在运行的 [Activity](https://developer.android.google.cn/reference/android/app/Activity.html)**(先后调用 [onDestroy()](https://developer.android.google.cn/reference/android/app/Activity.html#onDestroy()) 和 [onCreate()](https://developer.android.google.cn/reference/android/app/Activity.html#onCreate(android.os.Bundle)))。重启行为旨在通过利用与新设备配置匹配的备用资源自动重新加载您的应用,来帮助它适应新配置。
要妥善处理重启行为,Activity 必须通过常规的[Activity 生命周期](https://developer.android.google.cn/guide/components/activities.html#Lifecycle)恢复其以前的状态,在 Activity 生命周期中,**Android 会在销毁 Activity 之前调用 [onSaveInstanceState()](https://developer.android.google.cn/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)),以便您保存有关应用状态的数据。 然后,您可以在 [onCreate()](https://developer.android.google.cn/reference/android/app/Activity.html#onCreate(android.os.Bundle))或 [onRestoreInstanceState()](https://developer.android.google.cn/reference/android/app/Activity.html#onRestoreInstanceState(android.os.Bundle)) 期间恢复 Activity 状态**。
系统会先调用 onSaveInstanceState(),然后再使 Activity 变得易于销毁。系统会向该方法传递一个 Bundle,您可以在其中使用 putString()和putInt()等方法以名称-值对形式保存有关 Activity 状态的信息。**然后,如果系统终止您的应用进程,并且用户返回您的 Activity,则系统会重建该 Activity,并将Bundle同时传递给onCreate()和onRestoreInstanceState()。您可以使用上述任一方法从Bundle提取您保存的状态并恢复该 Activity 状态。**如果没有状态信息需要恢复,则传递给您的Bundle是空值(如果是首次创建该 Activity,就会出现这种情况)。

![在两种情况下,Activity 重获用户焦点时可保持状态完好:系统在销毁 Activity 后重建 Activity,Activity 必须恢复之前保存的状态;系统停止 Activity 后继续执行 Activity,并且 Activity 状态保持完好。](http://upload-images.jianshu.io/upload_images/1098904-d51076149ffd3e79.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**即使您什么都不做,也不实现onSaveInstanceState(),Activity类的onSaveInstanceState()默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个View调用相应的onSaveInstanceState()方法,让每个视图都能提供有关自身的应保存信息**。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。
**无法保证系统会调用onSaveInstanceState(,因此您只应利用它来记录 Activity 的瞬态(UI 的状态)— 切勿使用它来存储持久性数据,而应使用onPause()在用户离开 Activity 后存储持久性数据(例如应保存到数据库的数据)**。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 这是我第三遍看《Android开发艺术探索》这本书了,从第一遍看的云里雾里,第二遍略微明白之后,我决定看第三遍,并...
    陈添阅读 824评论 2 8
  • 本篇博客是笔者看过《Android开发艺术探索》才写的,有些是借鉴了此本书的内容,当有些内容进行了精进。 Acti...
    ClAndEllen阅读 3,368评论 1 27
  • 启动与销毁Activity 不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对...
    安卓Boy阅读 1,706评论 3 5
  • 最近又开始捡起python了,偶尔小撸一把,顺带可以renew一下pip。 写Django项目,总要装一堆lib库...
    wu_sphinx阅读 480评论 0 0
  • 浅谈对于教育行业的看法 有人和我谈起在教育行业是老师重要还是销售重要的问题,会抬高嗓门8度...
    公孙晓阅读 524评论 0 0