《Android群英传》读书笔记8.Activity与Activity调用栈分析

来源:互联网 发布:平板电脑拍照软件 编辑:程序博客网 时间:2024/05/19 12:14

1. Activity

1.1. 起源

Activity是与用户交互的第一接口,系统采用Activity栈的方式来管理Activity。

1.2. Activity形态

  • Active/Running: Activity处于Activity栈的最顶层,可见,并与用户进行交互
  • Paused: Activity失去焦点,被一个新的非全屏的Activity或者一个透明的Activity放置在栈顶。只是失去了与用户交互的能力,所有状态信息、成员变量都还保持着,只有在系统内存极低的情况下,才会被系统回收掉
  • Stopped: Activity被另一个Activity完全覆盖,不再可见,但依然保持了所有状态信息和成员变量
  • Killed: Activity被系统回收掉或者Activity从来没有创建过
    用户的不同动作,会让Activity在这四种状态间切换。而开发者,虽然可以控制Activity如何“生”,却无法控制Activity何时“死”

1.3. 生命周期

Activity生命周期

  • Resumed: Activity处于栈顶,处理用户的交互
  • Paused: Activity的一部分被挡住,不会接收用户输入
  • Stopped: Activity完全被覆盖,不可见,仅在后台运行
1. Activity启动与销毁过程

启动:onCreate()onStart()onResume()→进入Resumed状态
销毁:onDestroy()→回到Killed形态
onCreate(): 创建基本的UI元素
onPaused()onStop(): 清除Activity的资源,避免浪费
onDestroy(): 引用会在Activity销毁的时候销毁,而线程不会,所以清除开启的线程

2. Activity的暂停与恢复过程

栈顶的Activity部分不可见,调用onPause()方法→进入Paused形态
结束阻塞后,调用onResume()方法→恢复到Resume形态
onPause(): 释放系统资源,如Camera、sensor、receivers
onResume(): 需要重新初始化在onPause()中释放的资源

3. Activity的停止过程

栈顶的Activity从部分不可见到可见,也就是恢复过程,调用onStart()方法;从部分不可见到完全不可见,也就是停止过程。

4. Activity的重新创建过程

系统需要更多内存或者系统内存极为紧张时,系统就会回收Activity,而系统会将Activity状态通过onSaveInstanceState()方法保存到Bundle对象中,也可以增加额外的键值对存入Bundle对象以保存这些状态。当需要重新创建这些Activity时,保存的Bundle对象会传递到Activity的onRestoreInstanceState()方法与onCreate()方法中,这也就是onCreate()方法中参数Bundle savedInstanceState的来源
Activity重新创建过程
onSaveInstanceState()方法并不是每次当Activity离开前台时都会调用的,如果使用finish()方法结束了Activity则不会调用。而且Android系统已经默认实现了控件的状态缓存,以此来减少开发者需要实现的缓存逻辑。

2. Android任务栈简介

当一个App启动时,如果当前环境中不存在该App的任务栈,那么系统就会创建一个任务栈,这个栈也被称为一个Task,即表示若干个Activity的集合。一个Task中的Activity可以来自不同的App,同一个App的Activity也可能不在一个Task中。
栈结构是后进先出的线性表。然而可以给Activity设置“特权”,就是通过在AndroidManifest文件中的属性android:launchMode来设置或者是通过Intent的flag来设置的。

3. AndroidMainifest启动模式

3.1. standard

默认的启动模式。这种启动模式每次都会创建新的实例,即创建新的MainActivity覆盖在原Activity上。

3.2. singleTop

如果指定启动Activity为singleTop模式,那么在启动时,系统会判断当前栈顶Activity是不是要启动的Activity,如果是则不创建新的Activity而直接引用这个Activity,如果不是则创建新的Activity。这种启动模式虽然不会创建新的实例,但是系统仍会在Activity启动时调用onNewIntent()方法。

3.3. singleTask

singleTask模式检测整个Activity栈中是否存在当前需要启动的Activity,如果存在,则将该Activity以上的Activity都销毁,将其置于栈顶。不过这里是指在同一个App中启动这个singleTask的Activity,如果是其他程序以singleTask模式来启动这个Activity,那么它将创建一个新的任务栈。如果启动的模式为singleTask的Activity已经在后台一个任务栈中了,那么启动后,后台的这个任务栈将一起被切换到前台

3.4. singleInstance

申明为singleInstance的Activity会出现在一个新的任务栈中,而且该任务栈中只存在这一个Activity

4. Intent Flag启动模式

常用的flag:

  • Intent.FLAG_ACTIVITY_NEW_TASK: 使用一个新的Task来启动一个Activity,但启动的每个Activity都将在一个新的Task中。该Flag通常使用在从Service中启动Activity的场景,由于在Service中并不存在Activity栈,所以使用该Flag来创建一个新的Activity栈,并创建新的Activity实例
  • Intent.FLAG_ACTIVITY_SINGLE_TOP: 使用singleTop模式来启动一个Activity
  • Intent.FLAG_ACTIVITY_CLEAR_TOP: 使用singleTask模式来启动一个Activity
  • Intent.FLAG_ACTIVITY_NO_HISTORY: 使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了,不会保留在Activity栈中

5. 清空任务栈

可以在AndroidMainifest文件中的标签中使用以下几种属性来清理任务栈

  • clearTaskOnLaunch: 通过这个属性,可以让这个Task每次初始化的时候,都只有这一个Activity
  • finishOnTaskLaunch: 通过这个属性,当离开这个Activity所处的Task,那么用户再返回时,该Activity就会被finish掉
  • alwaysRetainTaskState: 如果将Activity的这个属性设置为True,那么该Activity所在的Task将不接受任何清理命令,一直保持当前Task状态

6. Activity任务栈使用

如果过多地使用Activity任务栈,则会导致整个App的栈管理混乱

0 0
原创粉丝点击