Android 任务栈与4种启动模式

任务栈(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的值






猜你喜欢

转载自blog.csdn.net/luvalluo/article/details/80259580