Activity和Fragment的生命周期

Activity和Fragment生命周期有哪些?

activity生命周期

Activity和Fragment的生命周期_第1张图片
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"。**

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 后存储持久性数据(例如应保存到数据库的数据)**。

你可能感兴趣的:(Activity和Fragment的生命周期)