美文网首页
Activity生命周期与启动模式

Activity生命周期与启动模式

作者: ying1229 | 来源:发表于2021-01-23 19:44 被阅读0次

1. activity生命周期

1.1 典型情况下的生命周期

在典型情况下,activity的生命周期如下图:


life circle.jpg

其中各个方法含义如下:

方法名 说明
onCreate 表示activity正在被创建,生命周期的第一个方法,一般在这个方法里做初始化工作,例如初始化布局、数据等
onStart 表示activity正在被启动,此时activity已经可见了,但是还无法和用户交互,
onRestart 表示activity正在被重新启动,当activity从不可见状态变为可见状态时会被调用,即当前activity已经执行了onStop方法,此时用户又回到了这个activity,onRestart方法就回被调用
onResume 表示activity已经可见了,出现在前台,可以与用户进行交互
onPause 表示activity正在停止,一般情况下很快回接着调用onStop,但是如果在onStop之前快速的返回当前activity,那么onResume会被调用,一般会在这个方法里执行一些数据保存、停止动画等操作,不能执行太耗时的操作,因为只有当前的onPause执行完,才会执行新activity的onResume方法
onStop 表示activity即将停止不可见,可以做一些重量级的回收工作
onDestory 表示activity即将被销毁,生命周期的最后一个方法,在这个方法里需要做一些回收工作和最终的资源释放,例如EventBus的解绑等

1.2 异常情况下的生命周期

情况1:系统配置发生改变导致activity销毁重建

当系统配置发生改变时(例如横竖屏切换),如果没做特殊处理,activity会被销毁并进行重建,具体流程如下:


life circle - config change.jpg

如果需要避免这个重建流程,只需给activity添加以下配置即可:

android:configChanges="orientation"

情况2:系统内存资源不足,低优先级Activity被杀死

activity优先级由高到低分为以下3种:

1.前台activity,正在和用户进行交互的activity,优先级最高

2.可见但非前台activity,例如当前activity弹出了对话框,导致activity可见但无法和用户交互

3.后台activity,已经执行了onStop,不可见,优先级最低

当系统内存不足时,会按照上述优先级去杀死目标activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,如果一个进程中没有四大组件运行,那么将很快被系统杀死。

2.activity启动模式

2.1 标准模式-standard

系统默认启动模式,每次启动都会创建一个新的activity实例,被创建的activity的生命周期符合典型情况下的生命周期,此模式下由谁启动的activity,则新启动的activity就运行在谁的任务栈中。

2.2 栈顶复用模式-singleTop

在这种模式下,如果被启动的activity已经位于栈顶,则不会重新创建activity实例,而是会回调已有实例的onNewIntent方法,如果被启动的activity不位于栈顶,则还是会重新创建activity实例。

2.3 栈内复用模式-singleTask

单实例模式,在这种模式下,只要activity在一个栈中存在,多次启动就不会创建新的实例,而是会复用原有实例并且回调onNewIntent方法,具体情况如下图:


launch mode - singletask.jpg

在上图中,是否存在A想要的任务栈,这个想要的任务栈是由参数TaslAffinity决定,默认情况下,所有activity所需的任务栈都为包名,当设置了TaskAffinity时,TaskAffinity的值便是该activity运行的任务栈名。

eg:

  1. 当前任务栈S1中有ABC三个activity,此时activity D以singleTask模式启动,并且指定了TaskAffinity=S2,由于S2和D实例均不存在,所以系统会创建任务栈S2,然后创建D的实例,并且将其压入S2中
  2. 若D所需任务栈为S1,则直接创建D的实例,并压入S1中,此时S1中为ABCD
  3. 若D所需任务栈为S1,此时S1中情况为ADBC,此时由于D已经存在,所以会直接回调D的onNewIntent方法,同时会将在D之上的activity全部出栈,最终S1中的情况为AD

2.4 单例模式-singleInstance

单实例模式,具有所有singleTask特性,不同点在于,此模式下的activity只能单独存在于一个任务栈中。

参考文档
《Android开发艺术探索》

相关文章

网友评论

      本文标题:Activity生命周期与启动模式

      本文链接:https://www.haomeiwen.com/subject/nitvzktx.html