各种情况下的Activity生命周期与及跟Fragment生命周期的比较(为什么横屏切换竖屏会调用两次)

Activity的生命周期

一、默认:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestory()

onCreate():为Activity设置布局,此时界面还不可见;

onStart(): Activity可见但还不能与用户交互,不能获得焦点

onRestart(): 重新启动Activity时被回调

onResume(): Activity可见且可与用户进行交互

onPause(): 当前Activity暂停,不可与用户交互,但还可见。在新Activity启动前被系统调用保存现有的Activity中的持久数据、停止动画等。

onStop(): 当Activity被新的Activity覆盖不可见时被系统调用

onDestory(): 当Activity被系统销毁杀掉或是由于内存不足时调用

二、其他情况下:

  1.  两个Activity(A -> B)切换(B正常的Activity)的生命周期:

    onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> oStop(A)

    1)这时如果按回退键回退到A  onPause(B)->onRestart(A)->onStart(A)->onResume(A)->onStop(B)

    2)如果在切换到B后调用了A.finish(),则会走到onDestory(A),这时点回退键会退出应用

  2.  两个Activity(A->B)切换(B透明主题的Activity或是Dialog风格的Acivity)的生命周期:

    onPause(A)->onCreate(B)->onStart(B)->onResume(B)

    这时如果回退到A  onPause(B)->onResume(A)->oStop(B)->onDestory(B)

  3. Activity(A)启动后点击Home键再回到应用的生命周期:

    onPause(A)->oStop(A)->onRestart(A)->onStart(A)->onResume(A)

  4. Activity上有Dialog的时候和按Home键时的生命周期:

    AlertDialog并不会影响Activity的生命周期,按Home键后才会使Activity走onPause->onStop,AlertDialog只是一个组件,并不会使Activity进入后台

  5. 两个Activity 之间跳转时必然会执行的方法:

    前一个Activity的onPause,后一个Activity的onResume

  6. 前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命值周期回调方法:

    1)前台切换到后台,会执行onPause->onStop,再回到前台,会执行onRestart->onStart->onResume

    2) 弹出Dialog,并不会影响Activity生命周期

  7. 锁屏再解锁:
    锁屏会调用onPause()->onStop()方法,开屏后则调用onRestart->onStart->onResume()

横竖屏切换Activity 的生命周期

平时在网上看到的答案一般都是这样的↓↓↓

1、切换横屏时:

onSaveInstanceState->onPause->onStop->onDestory->onCreate->onStart->onRestoreInstanceState->onResume

2、切换竖屏时:

1)Android3.2前的版本会打印两次相同的log   (Android3.2后只有一次)

onSaveInstanceState->onPause->onStop->onDestory->onCreate->onStart->onRestoreInstanceState->onResume->onSaveInstanceState->onPause->onStop->onDestory->onCreate->onStart->onRestoreInstanceState->onResume

2) 如果在AndroidMainfest.xml中修改该Activity的属性,添加android:configChanges="orientation"

横竖屏切换,打印的log一样,同1)

3) 如果AndroidMainfest.xml中该Activity中的android:configChanges="orientation|keyboardHidden",则只会打印

onConfigurationChanged->

 

但是,实际测试结果并不是!所以是什么原因导致我们的结论不一样呢?

查看官方文档可以看到:

从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。因此,在开发针对 API 级别 13 或更高版本系统的应用时,若要避免由于设备方向改变而导致运行时重启(正如 minSdkVersiontargetSdkVersion属性中所声明),则除了"orientation"值以外,您还必须添加 "screenSize"值。即,您必须声明

android:configChanges="orientation|screenSize"

但是,如果您的应用是面向 API 级别 12 或更低版本的系统,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重启 Activity)。经过测试也确实如此。

结论:

一、Android 3.2 (API 级别 13)以前
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。

注:不设置Activity的android:configChanges时,切换竖屏activity的各个生命周期执行两次

二、从 Android 3.2 (API级别 13)开始

1、不设置Activity的android:configChanges,或设置Activity的android:configChanges="orientation",或设置Activity的android:configChanges="orientation|keyboardHidden",切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行一次。

2、配置 android:configChanges="orientation|keyboardHidden|screenSize",才不会销毁 activity,且只调用 onConfigurationChanged方法。

Activity与Fragment生命周期比较

一、Fragment的默认生命周期:

onAttach -> onCreate -> onCreateView -> onActivityCreated -> onStart -> onResume -> onPause -> onStop -> onDestoryView -> onDestory -> onDetach

二、其他情况:

  1. 切换到该Fragment:onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume
  2. 按下Power键:onPause->onSaveInstanceState->onStop
  3. 点亮屏幕解锁:onStart->onRestoreInstanceState->onResume
  4. 切换到其他Fragment: onPause->onStop->onDestoryView
  5. 切回到该Fragment: onCreateView->onActivityCreated->onStart->onResume
  6. 退出应用:onPause->onStop->onDestoryView->onDestory->onDetach

 

猜你喜欢

转载自blog.csdn.net/Nobody_else_/article/details/105432449