四种启动模式
standard
标准模式,也是activity
的默认启动模式
使用这种启动模式的activity
不会理会其所在的任务栈中是否已经有了实例,总会创建一个新实例放入栈中,这个很好理解;singleTop
栈顶复用模式
这个可以帮助性的理解为singleInTop, 意即栈顶只有一个实例,那也就是说如果不在栈顶,就会创建新实例放入栈中;
当有一个实例处于栈顶的时候,就会调用onNewIntent
,而不会调用onCreate
和onStart
, 然后调用onResume
,即跳过前两个生命周期函数;
举个例子,1.栈中此时为ABC,栈顶为C,此时启动C活动,如果C的启动模式是singleTop
,那么启动后,栈中仍为ABC;2. 栈中此时为ACB,栈顶为B,如果C的启动模式是singleTop
,启动C活动后,栈的内容就会变成ACBC;3. 栈中此时为ABC,栈顶为C,此时启动C活动,如果C的启动模式不是singleTop
,而是standard
,那么启动后,栈中为ABCC;singleTask
栈内复用模式
同样,可以帮助性的理解为singleInTask ,设置为这种启动模式的avtivity
只要在栈中存在,无论是不是在栈顶,都不会再创建,而是会把实例移到栈顶来,但是这是栈,没法直接交换栈内数据,所以只能进行清顶 ,即把这个实例上面的所有活动都弹出栈,这样这个实例就成为栈顶了;当然,如果这个活动不存在,那么就正常的创建然后入栈;如果活动需要的栈不存在(栈的名字与这个活动的taskAffinity
的值相同,默认的栈名是包名),那么就新创建一个栈,然后创建实例,最后入这个新的栈;singleInstance
单实例模式
这种启动模式除了具有singleTask
的所有特性(栈内复用、清顶,新建栈等)外,还限制了设置这种启动模式的活动只能单独存在一个任务栈中,后续也不会再创建这个活动的实例;这种情况下,按下back键的时候会先清除一个栈,然后再清除另一个栈,并没有按照调用顺序的反序来出栈。
另,个人认为:
假如A活动启动B活动,那么B活动在正常情况下是会进入A活动的任务栈的,
除非1.指定B活动的taskAffinity
与A的taskAffinity
不同,那么AB活动的栈名就不会一样,B也就不会进入A的栈中了;或者2. B的启动模式为singleInstance
, B也不会进入A的任务栈。
参考任玉刚大神的开发艺术探索,以上如有错误,敬请指正,不胜感激!