阅读 201

Android基础:Activity的生命周期和启动模式

Activity的生命周期分析

将Activity的生命周期分为两部分:

1、典型情况下的生命周期

正常情况系,Activity会经历如下生命周期:

  1. onCreate:表示Activity正在被创建
  2. onRestart:表示Activity正在被重新启动
  3. onStart:表示Activity正在被启动,这时已经可见,但没有出现在前台无法进行交互
  4. onResume:表示Activity已经可见,并且处于前台
  5. onPause:表示Activity正在停止(可做一次保存状态停止动画等非耗时操作)
  6. onStop:表示Activity即将停止(可进行重量级回收工作)
  7. onDestroy:表示Activity即将被销毁

附加说明: 针对某一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按照优先级大致分为三种:

  1. 前台Activity:正在和用户交互的Activity,优先级最高;
  2. 可见但非前台(可见但不可交互):例如Activity中有弹窗,无法进行交互;
  3. 后台Activity:已经执行过onStop的Activity

当系统内存不足时,系统会按照上述优先级去杀死目标Activity,并通过后续的onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。

Activity的四种启动模式

  1. standard:标准模式,也是默认模式。每次启动都会创建一个全新的实例。
  2. singleTop:栈顶复用模式。这种模式下如果Activity位于栈顶,不会新建实例。onNewIntent会被调用,接收新的请求信息,不会再低啊用onCreate和onStart。
  3. singleTask:栈内复用模式。升级版singleTop,如果栈内有实例,则复用,并会将该实例之上的Activity全部清除。
  4. 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、锁屏、来电
关注下面的标签,发现更多相似文章
评论