Activity生命周期看这一篇足够了

文章目录

  • 前言
  • 一、activity生命周期
  • 二、onSaveInstanceState(Bundle outState)
    • 1.outState参数
    • 2.调用时机
    • 3.注意事项
  • 三、onRestoreInstanceState(Bundle outState)
    • 1.调用时机
  • 四、onNewIntent()
  • 五、activity切换生命周期的变化
    • 1、几种情况
    • 2、dialog对生命周期的影响
    • 3、横竖屏切换
    • 4、锁屏


前言

android学习中,Activity是非常重要的一部分,接下来进行activity生命周期的讲解和具体的应用


一、activity生命周期

oncreate()->onstart()->onResume()->onRestart()->onPouse()->onStop()-> onDestory()

Activity生命周期看这一篇足够了_第1张图片

  • onCreate():activity创建时调用,进行初始化布局的操作
  • onStart()onCreate()执行完之后执行,此时activity处于可见状态,但没有焦点,不可以交互
  • onResume():此时activity处于前台,用户可见,可进行交互
  • onPause():另一个activity覆盖当前activity时,调用onPause()方法,此时activity仍处于可见状态,但不可以交互
  • onStop():另一个activity完全覆盖当前activity,此时activity不可见
  • onDestroy():此时activity从栈中移除,完全被销毁
  • onRestart():activity重新回到前台时被调用

二、onSaveInstanceState(Bundle outState)

1.outState参数

起到数据保存作用,Activity 声明周期结束的时候, 需要保存 Activity 状态的时候, 会将要保存的数据使用键值对的形式 保存在 Bundle 对象中

2.调用时机

  • 从最近使用的应用程序中选择运行其他应用程序
  • 当用户按下HOME键时
  • 屏幕方向切换时(无论竖屏切横屏还是横屏切竖屏都会调用)
  • 按下电源按键(关闭屏幕显示)时
  • 从当前activity启动一个新的activity时

onPause() -> onSaveInstanceState() -> onStop()

3.注意事项

  • 用户主动销毁不会调用 : 当用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法
  • 布局中组件状态存储 : 每个组件都实现了 onSaveInstance() 方法, 在调用函数的时候, 会自动保存组件的状态, 注意,:只有有 id 的组件才会保存

三、onRestoreInstanceState(Bundle outState)

1.调用时机

onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用,如果内存充足,系统没有销毁这个 Activity,就不需要调用

  • 屏幕方向切换时生命周期调用(不做任何配置)

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


四、onNewIntent()

如果IntentActivity处于任务栈的顶端,也就是说之前打开过的Activity,现在处于onPauseonStop 状态的话,其他应用再发送Intent的话,执行顺序为:onNewIntent->onRestart->onStart->onResume

  • 当ActivityA的LaunchMode为SingleTop时,如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法
  • 当ActivityA的LaunchMode为SingleInstance,SingleTask时,如果已经ActivityA已经在堆栈中,那么此时再次启动会调用onNewIntent()方法

五、activity切换生命周期的变化

1、几种情况

1、当B Activity 的 launchMode 为 standard 或者 B Activity 没有可复用的实例时
Activity A跳转Activity B,再按返回键,生命周期执行的顺序

当A跳转到B的时候,A先执行onPause,然后是B再执行onCreate -> onStart -> onResume,最后才执行A的onStop

当B按下返回键,B先执行onPause,然后是A再执行onRestart -> onStart -> onResume,最后才是B执行onStop -> onDestroy

2、当 B Activity 的 launchMode 为 singleTop且 B Activity 已经在栈顶时,此时只有 B 页面自己有生命周期变化

B.onPause -> B.onNewIntent -> B.onResume

3、当 B Activity 的 launchMode 为 singleInstance,singleTask 且对应的 B Activity 有可复用的实例时

A.onPause -> B.onNewIntent -> B.onRestart -> B.onStart -> B.onResume -> A.onStop -> ( 如果 A 被移出栈的话还有一个 A.onDestory)

2、dialog对生命周期的影响

1、弹一个普通的dialog

  • 生命周期回调都是 AMS 通过 Binder 通知应用进程调用的;而弹出 DialogToastPopupWindow 本质上都直接是通过 WindowManager.addView 显示的(没有经过 AMS),所以不会对生命周期有任何影响

2、如果是启动一个 Theme 为 Dialog 的 Activity

  • 生命周期为:A.onPause -> B.onCreate -> B.onStart -> B.onResume

注意这边没有前一个 Activity 不会回调 onStop,因为只有在 Activity 切到后台不可见才会回调 onStop,而弹出 Dialog 主题的 Activity 时前一个页面还是可见的,只是失去了焦点而已所以仅有 onPause 回调

3、横竖屏切换

1、Android 3.2 (API 级别 13)以前

  • 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
  • 设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
  • 设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

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

  • 不设置Activity的android:configChanges,或设置Activity的android:configChanges="orientation",或设置Activity的android:configChanges="orientation|keyboardHidden",切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行一次
  • 配置 android:configChanges="orientation|keyboardHidden|screenSize",才不会销毁 activity,且只调用 onConfigurationChanged方法

4、锁屏

锁屏时只会调用onPause(),而不会调用onStop方法,开屏后则调用onResume()


参考
https://www.jianshu.com/p/dbc7e81aead2
https://www.sohu.com/a/402329833_611601

你可能感兴趣的:(android,java,kotlin)