activity的相关基础

83 阅读2分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

Activity的异常生命周期

实际使用中,Activity并不是一成不变的,比如页面旋转时,原来的Activity的资源肯定会发生改变,又或者由于内存不足,Activity也会有闪退的情况

相关资源改变

比如手机屏幕旋转后,Activity需要去重新加载相应的图片,此时Activity会重新创建。 此时触发的生命周期为 onSaveInstanceState -> onDestory -> onCreate -> onRestoreInstanceState 其中onSaveInstanceState会发生在onPause前后。
Activity在被销毁之前会保存它的View的层次结构,该保留过程和View的事件分发类似,都是从Activity ->Window -> DecorView -> View,直到分发到具体View之后,就可以让其保存其数据

内存不足

当内存不足时,系统会将优先级较低的Activity给杀死。显然越是和用户在交互的Activity其优先级应该是越高的,这样Activity的优先级可以分为三类:与用户交互的前台Activity,被弹窗或图层挡住的Activity,和后台Activity

Activity的启动模式

之前文章在分析Activity的创建过程中提到,每个Activity都有一个与它对应的栈,Activity的启动模式其实就是说Activity创建时放的栈的位置,在这之前需要说明一个概念:某个Activity所需的任务栈是通过TaskAffinity这个参数来指定的,默认情况下这个参数的值是包名

  • standard:放在启动它的Activity的活动栈中
  • singleTop:如果栈顶有该Activity(启动它的Activity的栈)那么不创建,否则创建Activity
  • singleTask :查找是否有TaskAffinity的任务栈,如果有且Activity在栈中那么该任务栈出栈直到Activity在栈顶,如果不在栈中,那么添加到栈顶。如果没有该任务栈则创建一个任务栈,放入栈中。
  • singleInstance :会创建一个新的任务栈,将Activity放在该任务栈中。

Activity的标志(Flags)

之前我们在指定一个Activity的启动方式时一般都是在主配置文件中进行设置,不过这里也可以通过标志的方式来设置,如FLAG_ACTIVITY_NEW_TASK,FLAG_ACTIVITY_SINGLE_TOP,FLAG_ACTIVITY_CLEAR_TOP。 当然也有别的标志比如FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS表示该activity不会出现在历史列表中