一、知识总结
Activity生命周期与启动模式总结.png二、Activity生命周期
-
Activity状态
Activity状态.png
上图是Activity状态迁移图:
Resumed:
此时Activity处于前台,是可见可交互的,处于在栈顶位置。
Paused:
Activity被部分遮盖,比如说启动一个半透明的Activity或者Dialog类型的Activity时,Activity不会被完全遮盖,任然可见,在系统内存不足的情况下有可能被回收。
Stopped:
Activity被完全遮盖,不可见,有必要时可以被回收,被回收的可能性比处于Pause状态时要大。
其他状态(“创建”和“开始”)是瞬态,系统会通过调用下一个生命周期回调方法从这些状态快速移到下一个状态。 也就是说,在系统调用 onCreate() 之后,它会快速调用 onStart(),紧接着快速调用 onResume()。
-
Activity正常生命周期
image.png
onCreate:
表示Activity正在被创建,做一些初始化的操作,比如初始化View,调用setContentView设置界面布局资源等等。
onStart:
这个方法会很快的执行,这个方法被执行表明Activity已经做好进入前台以及与用户交互的准备了,已经是可见的了,但是还没有获得焦点,还不能与用户交互,不在前台,onResume方法会接着被调用。
onResume:
onResume紧接着onStart被调用,此时Activity是可见的并且是可以交互的,处于前台。
onPause:
此时Activity被部分遮盖,任然可见,但是已经失去焦点,不能与用户交互。需要注意的是只有这个方法被执行之后,才会去创建被启动的Activity,因此在onPause方法中不能做耗时操作,否则会导致下一个要启动的Activity不能及时被创建。
onStop:
这个方法被调用时,Activity是处于不可见,当然已不再是可交互,更不在前台,这里可以做一些资源的回收,过于重量级的操作也不应该放在这里。
onDestroy:
表示Activity即将被回收,大多数应用不需要实现此方法,因为局部类引用与 Activity 一同销毁,并且您的 Activity 应在onPause()和onStop()期间执行大多数清理操作。但是如果 Activity 包含在onCreate()期间创建的后台线程或其他如若未正确关闭可能导致内存泄露的长期运行资源,则应在onDestroy()期间终止它们。另外这里提一下onDestroy()与finish()的区别,调用finish()方法,系统只是将最上面的Activity移出了栈,并没有马上的调用onDestory()方法,其占用的资源也没有被马上释放,即finish()只是负责将Activity移除栈,资源的释放时机是系统自己控制的。比如:在onCreate()调用finish(),函数回调顺序是:onCreate()-->finish()-->onDestroy();在onStart()中调用finish(),函数调用顺序:onCreat()-->onStart()-->finish()-->onStop()-->onDestroy()
-
Activity 异常生命周期
Activity 异常生命周期.png
上图展示的是Activity因为某些场景(下文提及)导致Activity关闭重新创建打开的生命周期,在Activity关闭之前,准确来说应该是onStop()方法被调用之前,会调用onSaveInstanceState()来保存状态,状态信息存在Bundle这样的数据结构中,并同时传给了新生成的Activity的onCreat()和onResoreInstanceState()。这里主要需要注意的有:
1.onSaveInstanceState方法一定是在onStop之前被调用的,与onPaused没有先后顺序之分。上文的Activity生命周期有提到onStop方法里系统其实是已经做一些轻量级的资源回收了,因此这里不难理解系统让onSaveInStanceState方法在onStop之前被调用。
2.异常生命周期是会导致Activity被杀死重新创建的,保存的状态信息会同时被传给新生成的Activity的onCeate和onRestoreInstanceState方法。
Activity异常生命周期的两种情景:
1.资源相关的系统配置发生改变导致Activity被杀死并重新创建
系统配置项目如下:
系统配置项目.png
当系统配置发生改变之后Activity会被重新创建,当然也有办法阻止系统创建Activity,方法如下:
指定Activity的configChanges属性,比如不想让Activity在屏幕旋转时重新创建,可以给Activity的configChanges属性添加orientation这个值,如下:
android:configChanges="orientation"如果想指定多个值可以用“|”隔开。
2.资源内存不足导致低优先级的Activity被杀死
Activity按照优先级分为3种
- 前台Activity——正在和用户交互的Activity,优先级最高
- 可见但非前台的Activity——Activity可见但是失去焦点不能交互,比如Activity弹出一个对话框,又比如Activity启动一个半透明的Activity没有完全被遮盖
- 后台Activity已经被暂停的Activity,比如调用了onStop,优先级最低。
在系统内存不足时,会按照Activity的优先级回收Activity。
网友评论