在Android中每一个界面都是一个Activity,切换界面操做实际上是多个不一样Activity之间的实例化操做。在Android中Activity的启动模式决定了Activity的启动运行方式。html
Activity具备四种启动模式:standard、singleTop、singleTask、singInstance。启动模式可经过AndroidManifest.xm中Activity的launchMode属性配置,或者经过使用Intent flags设置。android
默认启动方式,当执行startActivity时,默认会建立一个新的Activity实例并加入到任务栈中。app
当执行startActivity时,若是当前任务栈中已经具备该Activity实例,而且位于栈顶,则不会建立新实例,而会调用原有实例的onNewIntent方法。不然,建立新的实例并加入栈顶。spa
好比:假如任务的后退栈中包含四个ActivityA-B-C-D(D位于栈顶)。当新的Intent但愿启动D,而D得launchMode是默认的“standard”,则将会产生一个新的D加入到栈顶,则后退栈变成A-B-C-D-D。 若是D的launchMode是"singleTop",则原有的D实例将会经过onNewIntent来接受intent。则任务栈依然是A-B-C-D。 若是要求启动B,则将会新建一个D加入到栈中,即便B的launchMode是"singleTop"。.net
若是任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例所有移除,调用该实例的onNewIntent()方法重用该Activity,使该实例处於栈顶位置,不然就从新建立一个新的Activity实例。code
在这个位置,我有一个疑问,新建立的Activity实例是加入到原有任务栈中仍是建立一个新的任务栈呢? 之因此会有这个疑问,是由于Google的官方文档上的描述是这样的:htm
文字信息是:blog
The system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing instance through a call to itsonNewIntent()
method, rather than creating a new instance. Only one instance of the activity can exist at a time.文档
大意是,对于设置为"singleTask"的Activity,若是在task中不存在该Activity实例,系统将建立一个新的task和新的Activity实例,而后将这个Activity实例放在新的task的根(也就是栈底)。若是已经存在该实例,则经过调用onNewIntent将intent传递给该实例。 get
咱们的关注点放在是否建立新的task上,在我看来一个task就对应一个后退栈,那么是否意味着利用singleTask新建立的Activity实例会放到新的栈上呢?
在博客园或者CSDN上看到不少博主关于singleTask的模式的介绍都没有明确这一点,所以非常疑问。不过,在网上看到一篇文章《深入理解Activity启动模式XXX》,应该能解答个人疑惑。里面有说到:
一个Activity的Launch Mode为singleTask时,在新建这个Activity时,默认taskAffinity状况下,通常不会新建task,taskAffinity属性默认application中是相同的,那么就会新建在当前栈。…… 其实,把启动模式设置为singleTask,framework在启动该activity时只会把它标示为可在一个新任务中启动,至因而否在一个新任务中启动,还要受其余条件的限制。增长一个taskAffinity属性给启动的singleTask的aty,那么将在新task启动。
对于这个问题暂时先搁置,以后想办法作实验进行验证。
整个系统中有且只有一个该Activity实例,且该实例位于单独的一个栈中,该栈中有且只有一个该Activity。当再次启动该Activity时,调用onNewIntent传递intent。
一个Activity的Launch Mode为singleInstance时,老是在新的任务中开启,而且这个新的任务中有且只有这一个实例,也就是说被该实例启动的其余activity会自动运行于另外一个任务中。当再次启动该activity的实例时,会重用已存在的任务和实例。而且会调用这个实例的onNewIntent()方法,将Intent实例传递到该实例中。和singleTask相同,同一时刻在系统中只会存在一个这样的Activity实例。