任务栈(Task)是用来管理一个或多个Activity的栈结构。
特点:
- (1) 程序打开时就创建了一个任务栈, 用于存储当前程序的activity,当前程序(包括被当前程序所调用的)所有的activity属于一个任务栈。
- (2) 一个任务栈包含了一个activity的集合, 可以有序的选择哪一个activity和用户进行交互,只有在任务栈栈顶的activity才可以跟用户进行交互。
- (3) 任务栈可以移动到后台,并且保留了每一个activity的状态. 并且有序的给用户列出它们的任务, 而且还不丢失它们状态信息。
- (4) 退出应用程序时,当把所有的任务栈中所有的activity清除出栈时,任务栈会被销毁,程序退出。
缺点:
- (1) 每开启一次页面都会在任务栈中添加一个Activity,而只有任务栈中的Activity全部清除出栈时,任务栈被销毁,程序才会退出,这样就造成了用户体验差,需要点击多次返回才可以把程序退出了。
-
(2) 每开启一次页面都会在任务栈中添加一个Activity还会造成数据冗余重复数据太多,会导致内存溢出的问题(OOM)。
活动的4种启动模式:
在Manifest.xml 的设置方式:
activity 里:
android:launchMode = "standard/singleTop/singleTask/singleInstance"
1.standard-标准模式
默认启动模式,不管这个活动是否已经在栈中,每次启动都会创建该活动的新的实例放入栈;
2.singleTop
在活动启动时,如果发现任务栈的栈顶是该活动,那么会直接使用栈顶的活动,而不会在创建实例;
但是当要创建的活动不是在栈顶时,即使栈中已有该活动的实例,仍然会创建新的实例;
3.singleTask
每次启动活动时,先检查任务栈中是否已有该活动的实例,如果没有就创建,否则弹出该实例前面所有的活动(即将其他活动都销毁掉),使该活动处于栈顶;如果指定了不同的taskAffinity 会启动一个新的任务栈。不要随便使用这个模式。
4.singleInstance
singleInstance模式会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入;
当一个应用程序加载一个singleInstance模式的Activity时,如果该Activity没有被实例化,那么就重新创建一个Task,并入栈,如果已经被实例化,那么就调用该Activity的onNewIntent,singleInstance的Activity所在的Task不允许存在其他Activity,任何从该Activity加载的其它Activity(假设为Activity2)都会被放入其它的Task中,如果存在与Activity2相同affinity的Task,则在该Task内创建Activity2,如果不存在,则重新生成新的Task并入栈;
每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task,如果一个Activity没有显式的指明该Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果 Application也没有指明,那么该taskAffinity的值就等于包名,而Task也有自己的affinity属性,它的值等于它的根Activity的taskAffinity的值。