一.正常情况下生命周期:
1. 生命周期有哪些函数:
onCreate(): Activity正在创建,做一些初始化工作。
OnRestart(): Activity正在重新启动,从不可见到可见调用这个方法。
OnStart(): Activity正在启动,可见但不位于前台。
OnResume(): Activity可见且位于前台,可与用户交互。
OnPause(): Activity正在停止,可见但不位于前台,与OnResume()是一对。
OnStop(): Activity即将停止,不可见,可与做些重量级回收操作,与OnStart()是一对。
OnDestroy(): Activity即将被销毁,做一些回收和最终资源的释放,与onCreate()是一对。
2. 不同场景下的生命周期:
(1)第一次启动:onCreate() -> onStart() -> onResume()
(2)Activity(A)打开新的Activity(B):A.onPause() ->B onCreate() -> B onStart() -> B onResume() -> A onStop()
(3)用户从Activity(B)按back键回到Activity(A):B.onPause() ->A.onCreate() -> A.onStart() -> A.onResume() -> B.onStop()
(4)锁屏:锁屏时只会调用onPause(),而不会调用onStop方法,开屏调用onResume()
(5) 弹出 Dialog: 直接是通过 WindowManager.addView 显示的(没有经过 AMS),所以不会对生命周期有任何影响。
(6)启动theme为DialogActivity,跳转透明Activity:A.onPause -> B.onCrete -> B.onStart -> B.onResume
二.异常情况下生命周期:
1.资源相关的系统配置发生改变导致Activity被杀死并重新创建
默认情况下,如果activity不做处理,系统配置发生改变,activity会被销毁并重新创建。系统调用OnSaveInstanceState保存当前activity的状态,当activity被重新创建时,系统调用OnRestroreInstanceState拿到保存的数据。
在OnSaveInstanceState和OnRestroreInstanceState方法中,系统默认帮我们恢复了一部分数据(视图结构),是根据view的id存储和恢复的。
例如横竖屏切换时:
竖屏:启动:onCreat->onStart->onResume.
切换横屏时:
onPause-> onSaveInstanceState ->onStop->onDestory
onCreate->onStart->onSaveInstanceState->onResume
但是配置:androidconfigChanges=“orientation|keyboardHidden|screenSize”,就不会在调用Activity的生命周期,只会调用onConfigurationChanged方法。
2.资源内存不足导致低优先级的Activity被杀死
优先级:前台Activity > 可见但非前台的Activity > 后台Activity
三.Acticity的启动模式
1.Standard:标准模式。每次启动Activity都会创建一个新的Activity实例
2.SingleTop:栈顶复用模式。如果要启动的Activity已经在栈顶,则不会重新创建Activity,只会调用该该Activity的onNewIntent()方法,如果要启动的Activity不在栈顶,则会重新创建该Activity的实例。
3.SingleTask:栈内复用模式。只要Activity在一个栈内存在,则不会创建实例,将这个Activity实例上面的Activity全部出栈,然后回调onNewIntent()方法;如果Activity不存在于栈内,则创建该实例。
4.SingleInstance:要创建在一个新栈,然后创建该Activity实例并压入新栈中,新栈中只会存在这一个Activity实例.
附一个命令用来查看栈内的activity:
adb shell dumpsys activity