Activity的生命周期分析
将Activity的生命周期分为两部分:
1、典型情况下的生命周期
正常情况系,Activity会经历如下生命周期:
- onCreate:表示Activity正在被创建
- onRestart:表示Activity正在被重新启动
- onStart:表示Activity正在被启动,这时已经可见,但没有出现在前台无法进行交互
- onResume:表示Activity已经可见,并且处于前台
- onPause:表示Activity正在停止(可做一次保存状态停止动画等非耗时操作)
- onStop:表示Activity即将停止(可进行重量级回收工作)
- onDestroy:表示Activity即将被销毁
- 第一次启动:onCreate->onStart->onResume;
- 打开新的Activity或者返回桌面:onPause->onStop。如果打开新的Activity为透明主题,则不会调用onStop;
- 当回到原来Activity时:onRestart->onStart->onResume;
- 当按下返回键:onPause->onStop->onDestroy
当从A启动B时: onPause(A)->onCreate(B)->onStart(B)->onResume(B)->onStop(A)
2、异常情况下的生命周期
这里的异常情况主要分为两种:
资源相关的系统配置文件发生改变导致Activity被杀死并重建
例如横竖屏切换:当系统配置发生改变后
- Activity就会被销毁(onPause->onStop->onDestroy依次调用);
- 。由于是在异常情况下终止的,所以系统会调用onSaveInstanceState保存当前Activity状态。onSaveInstanceState在onStop之前调用,跟onPasue没有时序关系;
- 当Activity被重新创建后,系统会调用onRestoreInstanceState(在onStart之前调用),并把onSaveInstanceState中保存的Bundle作为参数传递给onCreate和onRestoreInstanceState
正常情况下Activity不会调用onSaveInstanceState和onRestoreInstanceState,可以根据onRestoreInstanceState来判断Activity是否被重建。 Activity会为我们自动做一些恢复工作,例如当前视图结构和数据(文本框用户输入数据,ListView滚动位置)
当Activity被异常销毁时,我们可以在onSaveInstanceState保存一些数据,然后等Activity重建在onCreate里或者onRestoreInstanceState获取状态信息。二者的区别是:onCreate正常启动时,其参数Bundle可能为空,而onRestoreInstanceState一旦被调用,Bundle必定不为空。
内存资源不足导致低优先级的Activity被杀死
Activity按照优先级大致分为三种:
- 前台Activity:正在和用户交互的Activity,优先级最高;
- 可见但非前台(可见但不可交互):例如Activity中有弹窗,无法进行交互;
- 后台Activity:已经执行过onStop的Activity
当系统内存不足时,系统会按照上述优先级去杀死目标Activity,并通过后续的onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。
Activity的四种启动模式
- standard:标准模式,也是默认模式。每次启动都会创建一个全新的实例。
- singleTop:栈顶复用模式。这种模式下如果Activity位于栈顶,不会新建实例。onNewIntent会被调用,接收新的请求信息,不会再低啊用onCreate和onStart。
- singleTask:栈内复用模式。升级版singleTop,如果栈内有实例,则复用,并会将该实例之上的Activity全部清除。
- singleInstance:系统会为它创建一个单独的任务栈,并且这个实例独立运行在一个 task中,这个task只有这个实例,不允许有别的Activity 存在(可以理解为手机内只有一个)
指定启动模式的方法
在AndroidMenifest里指定启动模式
<activity android:name=".singletop.SingleTopActivity" android:launchMode="singleTop">
通过Intent中设置flag指定启动模式
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TASK);
四种启动模式的常见使用场景
| LauchMode | 场景 |
|---|---|
| standard | 绝大多少普通场景 |
| singleTop | 登录注册页面、WXPayEntryActivity、WXEntryActivity |
| singleTask | 主页面、订单页、付款、扫码等 |
| singleInstance | 系统Launcher、锁屏、来电 |