Activity 启动模式-笔记

Activity 启动模式

  • standard:标准模式,每启动一个 Activity 不管该实例原来是否创建过,都会在栈中创建一个该 Activity 实例。

  • singleTop: 栈顶复用模式,如果启动的 Activity 实例正处于当前栈顶时,就不会重新创建实例(此时 onNewIntent() 方法会被调用);不在栈顶就创建该实例;同一个任务栈中可能存在两个以上相同的实例。A(startActivity)-B(startActivity)-A(此时A不会重新创建,也就时 onCreate 和 onStart 不会被调用到)

  • singleTask: 栈内单例复用,启动这样的一个 Activity 时,把该实例放入该栈(默认栈或者指定一个新栈),同一个栈中只能有一个该 Activity 实例,这个任务栈可以存放 非 singleInstance 的 Activity 实例, 当栈内已存在实例时,先把该实例前面别的所有实例移除出栈,以确保该实例处于栈顶位置(此时 onNewIntent() 方法会被调用)。

假设 B 为 singleTask,没有指定 taskAffinity ;B-C-D-E-B,此时会先退出E、D、C ,然后显示 B

  • singleInstance: 单栈单例单一,创建新的任务栈,将实例放入,一个栈只装一个实例。与 singleTask 不同的是,该新创建的栈不能放别的任何实例。

TaskAffinity

其实每个 Activity 任务栈都有一个名字,通常是包名来命名,我们也可以创建一个新的栈,给新的栈命名,但名字不能和包名相同。

而创建新的栈,只需要在清单文件中的 < activity > 标签里面加上 taskAffinity:”栈名”

A: standard
B: singleTask 和 taskAffinity=”newtask”
C: singleTask 和 taskAffinity=”newtask”

A-B-C-A-B-返回键-返回键 = ?


默认栈 有一个实例 A

启动 B:创建 newTask 栈,把 B 放入 newTask 栈

启动 C:把 C 放在 B 的上面

启动 A:因为 A 的启动模式是默认的,在哪个栈启动 A ,A 就应该放在哪个栈,所以 A 放入的应该是 newTask 栈(此时 newTask 栈从上到下有 ACB; 注意-默认栈还有一个最开始的 A 哦)

启动 B: A C 出栈,此时 newTask 栈中只有 B 一个

返回键,B 出栈

返回键,默认栈中的 A 出栈

结果显示: 桌面


Android 5.0+

standard模式下,在 5.0 后,跨应用来启动 Activity 出现了点变动。5.0之前:A 应用启动 B 应用的 Activity ,会把 B 的 Activity 放到 A 的栈中。5.0之后:创建一个新的栈来放 B 的 Activity。

还有注意:在5.0之前 使用 startActivityForResult 来获取结果可能为空的问题。

标记位

标记类型是在 java 代码的 Intent 中设置的,Intent 代码优先级比 xml 高。

  • FLAG_ACTIVITY_NO_HISTORY
    当该 Activity 启动其他 Activity 后,该 Activity 直接会被移除出栈销毁掉

还有别的几个标记位类型,因为从名字上就能判断出大概的意思,在组合使用时,记得多注意。