Activity生命周期全总结(亲测)

经典的生命周期流程图:
Activity生命周期图

除了图上常见的生命周期外,还有onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState方法:
1.onWindowFocusChanged:在Activity窗口获得或失去焦点时被调用。
2.onSaveInstanceState:调用此方法时,我们可以保存一些临时数据。
  (1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,此方法会被调用;
  (2)在用户改变屏幕方向时,此方法会被调用;
  (3)在当前Activity跳转到其他Activity或者按Home键回到主屏,自身退居后台时,此方法会被调用。
3.onRestoreInstanceState:我们可以重写此方法,以便可以恢复一些临时数据。
  (1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;
  (2)在用户改变屏幕方向时,重建的过程中,此方法会被调用。

以下是常见的几个过程的生命周期如何模拟后台app被杀?可以在终端用命令:adb shell am kill + 包名,或者在开发者模式中打开不保留活动选项 ):
1.启动Activity:
  onCreate -> onStart -> onResume -> onWindowFocusChanged
2.当前Activity转到新的Activity界面或按Home键回到主屏:
  onPause -> onWindowFocusChanged-> onSaveInstanceState -> onStop
3.后退回到此Activity或从主屏重新进入此Activity:
  onRestart -> onStart -> onResume -> onWindowFocusChanged
4.锁屏或当前Activity被其他Activity覆盖其上:
  onPause -> onSaveInstanceState -> onStop -> onWindowFocusChanged
5.解锁屏或当前Activity由被覆盖状态回到前台:
  onRestart -> onStart -> onResume -> onWindowFocusChanged
6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:
  onCreate -> onStart -> onRestoreInstanceState -> onResume -> onWindowFocusChanged
7.用户退出当前Activity:
  onPause -> onWindowFocusChanged -> onStop -> onDestory
8.旋转屏幕(不指定方向):
  onPause -> onSaveInstanceState -> onStop -> onDestory -> onCreate -> onStart -> onRestoreInstanceState -> onResume -> onWindowFocusChanged

异常情况:
1.资源相关的系统配置发生该改变导致Activity被杀死并重新创建。
  比如旋转屏幕,默认情况下,如果我们的activity不做特殊处理,那么当系统配置发生改变后,activity就会被销毁并重新创建。
  为了避免这样销毁重建的过程,我们需要在AndroidMainfest.xml中对应的Activity配置:
android:configChanges=”orientation|keyboardHidden|screenSize”
这样每次旋转方向时,只有onConfigurationChanged方法被调用,没有了销毁重建的过程。

2.资源内存不足导致低优先级的Activity被杀死。
  Activity按照优先级从高到低,可以分为以下三种:
  1. 前台Activity——正在和用户交互的Activity,优先级最高
  2. 可见但非前台Activity——比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户发生交互。
  3. 后台Activity——已经被暂停的Activity,比如执行了onStop。

当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来恢复数据。因此,一些后台工作不适合脱离四大组件而独自运行在后台中,比较好的方法是将后台工作放在service中从而保证进程有一定的优先级,这样就不会轻易的被系统杀死。

猜你喜欢

转载自blog.csdn.net/Kelaker/article/details/78194016