task
task是一个从用户角度出发的概念,它是一些activity的组合,它们组合起来是为了让用户完成某一件工作(或者说操作)。
task内的activity们以栈的形式组织起来,也就是back stack了。栈内的activity不会重新排序,只能push或者pop。栈内的activity可以来自不同的app,因此可以是运行在不同的进程,但是它们都属于同一个task内。
安卓系统是实时多task系统,用户可以随意在多个task之间切换。当一个task的栈内所有activity都pop之后,task也就销毁了。有时系统为了回收内存,会销毁activity,但是task不会销毁。
activity在manifest中有launchMode选项,可以配置其启动的模式。标准模式下,允许一个activity同时存在多个实例,既可以在同一个task,也可以在不同task。manifest可以指定launchMode,intent可以指定intent flag,前者供被启动者使用,后者供启动者使用,同时使用时后者会覆盖前者。
launchMode
- standard,默认模式,允许多实例
- singleTop,相比于standard,有新的启动请求时,只有在目标activity处于当前栈顶时,才会调用
onNewIntent()
而不创建新实例,其他情况都和standard一致 - singleTask,设置了”singleTask”启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的任务存在;如果存在这样的任务,它就会在这个任务中启动,否则就会在新任务中启动。因此,如果我们想要设置了”singleTask”启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。如果设置了”singleTask”启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例,如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity实例会位于任务的堆栈顶端中。
- singleInstance,和singleTask相比,不同点在于singleInstance activity所在的task只会有这一个activity
- 返回导航:singleTask和singleInstance启动的activity,尽管可能不在同一个task,但是仍然会回到原来的activity;但是singleTask可能会存在back stack“拼接”的情况
- 同一task内的activity可以是来自不同进程的activity
- 栈内的activity不会重新排序,只能push或者pop
- standard模式允许多实例,可以在不同的task
- singleTask的activity只会存在一个实例
- singleTask的activity如果设置了独立的taskAffinity属性值,启动时就会在新的task中,否则会在已有task中
- singleTask的activity启动时,它会在目标task(新的task或者已有task)中查看是否已经存在相应的activity实例,如果存在,就会把位于这个activity实例上面的activity全部销毁(pop, destroy)掉,即最终这个activity实例会位于任务的堆栈顶端中