Activity启动模式

两种方式可以定义Activity启动模式:
- Manifest
- Intent

Intent定义的启动模式优先于Manifest

Manifest定义的启动模式

  • "standard"(默认)
  • "singleTop"
    如果该Activity处于当前任务栈的顶部,系统会调用它的onNewIntent()方法,而不是创建一个新的实例。该Activity可以被实例化多次,每个实例可以属于不同的任务,而且一个任务可以拥有多个该Activity的实例。
  • "singleTask"
    系统会创建一个新的任务(可能会创建,也可能不创建,有条件)。然而,如果该Activity实例已经存在于一个别的任务中,系统会调用它的onNewIntent()方法。同一时间只有一个实例。
  • "singleInstance"
    系统不会在持有该Activity实例的任务中启动其他Activity,除此之外,其他都与singleTask相同。该Activity总是它所属任务的唯一成员,它启动的其他Activity都在其他任务中。

不管Activity运行在一个新的任务还是与启动它的Activity同样的任务,返回键总是把用户带到之前的Activity。然而,如果启动一个singleTask的Activity,而且该Activity处于一个后台任务中,那么整个任务都会被带到前台,此时,回退栈会包含该任务的所有Activity。
Activity启动模式_第1张图片

Intent定义的启动模式

  • FLAG_ACTIVITY_NEW_TASK
    "singleTask"相同。
  • FLAG_ACTIVITY_SINGLE_TOP
    "singleTop"相同。
  • FLAG_ACTIVITY_CLEAR_TOP
    如果已经该Activity已经在当前任务中运行,会清掉位于该Activity顶部的所有Activity,然后调用其onNewIntent()方法。如果该Activity为"standard",那么包括该Activity也会被清掉,然后新建一个该Activity的实例,因为"standard"模式的Activity总是会新建一个实例。

Affinity

相同affinity的Activity运行在相同任务中 ,可以通过"taskAffinity"设置。
两种情况需要该属性。
- 启动一个FLAG_ACTIVITY_NEW_TASK的Activity时。
设置为FLAG_ACTIVITY_NEW_TASK的Activity可以在一个新的任务中启动,但并非必然。如果找到了一个与被启动Activity相同affinity的任务,系统会把该activity加入此任务中,否则,才会开启一个新的任务。(默认情况下,一个应用的所有activity拥有相同的affinity,所以都运行在同一个任务中。)
- Activity的allowTaskReparenting属性设置为true时。
这种情况下,Activity能从启动时所属的任务A中移动到与该Activity的affinity相同的任务B中,当任务B来到前台时。

注意,如果不是这两种情况,那么该属性的设置是无用的

清空回退栈

如果用户长时间离开一个任务,系统会清掉这个任务除了根activity以外的其他activity。当用户重新返回这个任务时,只有根Activity被重建。有一些属性可以修改这个行为:
- "alwaysRetainTaskState"
如果在一个任务的根activity把该属性设置为true,那么刚才说到的默认行为就不会发生。
- "clearTaskOnLaunch"
如果在一个任务的根Activity把该属性设置为true,无论用户什么时候离开,都会发生上面的行为。
- "finishOnTaskLaunch"
该属性类似于"clearTaskOnLaunch",但是它只操作单一的Activity,而不是一整个任务。如果某个activity的该属性为true,那么用户任何时候离开后再返回这个任务,都会清掉这个activity

参考
Android官方文档
Activity singleTask之谜

你可能感兴趣的:(启动模式)