每个应用程序都有一个或者多个Activity组成,因此Android内部使用通过退回栈来管理Activity实例。栈是一种先进后出的集合,对于Android来说,当前的activity就在栈顶,当用户点击后退或者点击应用上的返回按钮,系统就会将栈顶的activity出栈,此时原来栈顶下的activity就会显示在设备上。在Android系统中有4种启动模式,用户可以在清单文件中注册activity时设置他的启动模式:
<activity
Android:launchMode=”启动模式”
/>
activity的启动模式分为:standard、singleTop、singleTask、singleInstance。
1、standard标准启动模式
这是activity的标准启动模式,也是activity的默认启动模式,在这种模式下activity可以被多次实例化,既在同一个任务栈可以在多个activity实例,每个实例都会处理一个intent对象。如果activityA的启动模式为standard,并且已经有个ActivityA被启动,在该Activity调用startActivity会启动一个新的ActivityA的实例。
ActivityA
|
2、singleTop
如果一个以singleTop模式启动的Activity的实例已经存在于任务栈的栈顶,那么再启动这个Activity时,不会创建新的实例,而是重用位于栈顶的那个实例,并且会调用该实例的onNewIntent()函数将intent对象传递到这个实例中。例如ActivityA的启动模式为singleTop,并且该实例已经存在栈顶,那么在调用startActivity启动另一个ActivityA时,不会再次创建ActivityA的实例,而是重用原来的实例,并且调用原来实例的onNewIntent()函数,此时任务栈中还是这一个ActivityA的实例。
如果以singleTop模式启动的Activity的一个实例不在栈顶,但是存在任务栈中,那么他的行为和standard模式相同也会创建一个新的实例。
ActivityA |
ActivityB |
ActivityA |
ActivityB |
栈顶的ActivityA被重用
ActivityB |
ActivityA |
ActivityA |
ActivityB |
ActivityA |
不在栈顶,重新创建一个ActivityA
3、singleTask
singleTask模式是常用的启动模式,如果一个Activity设置了改启动模式,那么在一个任务栈中只能有一个Activity的实例。如果任务栈中还没有该Activity,会新创建一个实例并放在栈顶。但是如果已经存在Activity系统销毁处在该Activity上的所有Activity,最终让该Activity实例处于栈顶,同时回调该Activity的onNewIntent()函数。
ActivityC |
ActivityB |
ActivityA |
ActivityA |
4、singleInstance
设置了singleInstance模式的Activity会在一个独立的任务中开启,并且这个新的任务中有并且只有这一个实例。也就是说被该实例启动的其他Activity会自动运行于另一个任务中。当再次启动该Activity实例的时候,会重用已存在的任务和实例。并且会调用该实例的onNewIntent()函数,将intent实例传递到该实例中。