Android的启动模式现在有4种,分别是standard,singleTop,singleTask和singleInstance.
其中’standard’和’singleTop’可以分为一组,singleTask和singleInstance分为一组
第一组:’standard’和’singleTop’可以有多个实例存在于同一个任务栈中(’singleTop’受到一些限制);
第二组:’singleTask’和‘singleInstance’每一个任务栈中只能有一个相同的实例,其中’singleInstance’的每个任务栈中只能有一个实例,也就是一个实例占用一个单独的任务栈。
’standard’ : 系统默认的启动模式,启动一个新的Activity都会调用该Activity的onCreate()方法创建新的实例,并且将该实例压入任务栈中。
实例图片展示了Activity A利用startActivity()启动Activity B,Activity B又回头启动Activity A,该过程都是利用系统默认的启动模式,即’standrad’,可以看到任务栈中存在2个Activity A,说明’standrad‘启动模式会重新创建新的实例并加入任务栈中。这时候点击回退按钮会依次回到 并呈现B的画面 , 栈底的A,直到回到桌面。
‘singleTop’,该模式也允许一个任务栈中存在多个相同的实例,只是在栈顶不允许出现相同的实例
上面的示例一是和’standrad‘的示例实现相同的过程,任务栈中出现2个A-Activity,这是可能的,示例二,当我们启动A和B之后想再启动一个新的Activity A是可能的,因为当前栈顶是Activity B的实例,但是如果现在我们要以singleTop模式启动新的 Activity B,任务栈中当前栈顶实例是B,系统不会调用B的onCreate()方法创建实例,而是调用B的onNewIntent()方法处理启动的Intent,任务栈中最终只存在A,B两个实例。
’singleTask‘,该模式只允许同一个任务栈中只存在一个相同的实例。
如上图所示现在执行了A启动B,B再启动C,任务栈中的状态。A在栈底,C在栈顶。此时我们用C想启动一个新Activity D,那么系统会调用D的onCreate()方法创建新的D的实例并压入栈顶。如果我们之前想用C启动A而不是D,系统会发现任务栈中已经有A存在,于是系统不会调用A的onCreate()方法创建新的实例,而是调用onNewIntent()方法处理该Intent,并使用将A之上的Acivity全部出栈的方式,将A置于栈顶,此时任务栈中只有A,如果之前是想要启动B,由于任务栈中已经有B,所以会和启动A一样,不会创建实例,而是调用onNewIntent(),然后将B之上的C出栈,使B处于栈顶,任务栈中将只存在A,B。
‘singleInstance’,该模式特点是一个Activity一个任务栈,即”一个萝卜一个坑“。
如上图,系统先启动了一个Activity A,然后利用A以singleInstance模式启动Activity B,这时候B不会和Activity A处于同一个任务栈,而是新建一个任务栈,然后将B加入,如果之后再启动一个不同的Activity C,那么系统会再次创建一个新的任务栈,然后将C加入,如果是启动A或B,系统会检查当前所有任务栈中是否有A或者B,如果有将不会调用onCreate()方法创建新的实例,而是调用onNewIntent()方法处理该Intent。如果没有找到该实例则重复创建C的步骤