Activity的启动模式有四种:standard,singleTop,singleTask和singleInstance,设置Actvity的xml属性android:launchMode,来达成开发中的实际需要。
*** Android对Activity的管理使用是栈,通常情况下,一个应用有一个任务task,它是完成某个工作的一堆Activity的集合,这些Activity被task以堆栈的形式组织和使用。一个时刻只允许一个Activity出现在栈顶,就像把一叠书一本放在一本上面叠起来,最上面的那本你看的最清楚。当新建一个Activity,它就处于栈顶的位置,旧的Activity就被压沉下去,就像新放一本书在这叠书上,原来那本最上面的书就被盖住了。当把处于栈顶也就是屏幕上显示的页面Activity销毁,此时在这个Activity下面的Activity浮到栈顶,显示到屏幕上,就像拿掉最上面那本书,它下面的那本书就能看清楚了。
1,standard模式:
Activity的默认启动模式,只要不指定launchMode,任何Activity都会使用此模式。新创建一个Activity,它就会被放在栈顶,此时系统不管这个Activity是否已经创建过了,实际开发中,一直重复创建某个Activity确实很消耗系统资源,开发中遇到这种情况,不妨考虑换种launchMode。
2,singleTop模式:
同一时刻不允许同一个Activity创建叠加,即当一个Activity已经处于栈顶的状态,此时再去启动这个Activity,是不会调用onCreate等生命周期去创建这个相同的Activity的,此时只会调用onNewIntent等生命周期方法。而当这个Activity不处于栈顶时,此时启动它的话,它又被创建了一次并置于栈顶,而此时就会调用onCreate等生命周期了。
举个例子:
一个应用里有两个Activity,A1和A2。A1为standard,A2为singleTop,在A1和A2的生命周期里打上Log。
(1)我们按照A1,A2,A2的顺序来启动,A1被创建,A2被创建,此时A2已位于栈顶,由于A2是singleTop模式,这是再启动A2,那么A2不会再被创建,而只是调用了onNewIntent等生命周期方法而已。
(2)我们按照A1,A2,A1,A2的顺序来启动,A1被创建,A2被创建,此时A2已位于栈顶,再创建了A1,A1位于栈顶了,A2被压了下去,这是再来创建A2,由于A2先前不是处于栈顶的位置(已经被A1取代),此时A2就会被重新创建,自然就会调用onCreate等生命周期了。
3,singleTask模式:
singleTask在当前task堆栈中具有唯一性,每次启动singleTask的Activity都会在堆栈里查找是否存在这个Activity的实例,如果有则直接使用此实例,并将此Activity实例之上所有的Activity全部移除堆栈外,即finish掉,并调用它的onNewIntent等方法。如果没有对应的Activity实例,则创建一个新的Activity放在堆栈中。一个task堆栈里允许有多个不同类名的singleTask模式的Activity。
举个例子:
一个应用里有两个Activity,A1和A2。A1为standard,A2为singleTask,在A1和A2的生命周期里打上Log。
(1)若打开的顺序为A1,A2,A1,开启A2后则会把之前的A1移出堆栈,新建A1后,A1位于栈顶,此时按返回键返回的是A2,再从A2按返回键返回,如果第一次开启A1之前没有Activity,则直接退出应用。(2)若打开的顺序为A2,A1,A2,A2创建后再创建A1,此时A1处于栈顶,再开A2时,系统在task堆栈中查找到了A2,这时不会调用onCreate生命周期,而调用onNewIntent,把A2放在栈顶,再把A1移出堆栈。
4,singleInstance模式:
此模式是四种模式种最为特殊复杂的模式,系统会独立开启一个task堆栈来管理这个singleInstance模式的Activity,并且理论上不再让其他的Activity进入当前的堆栈中。当一个Activity需要分享给另一个应用时,可以设置为singleInstance模式,只要这个Activity被创建后,没有被系统从堆栈中回收,就可持续化访问,避免多余的内存损耗。
举个例子:
一个应用里有两个Activity,A1和A2。A1为standard,A2为singleInstance,在A1和A2的生命周期里打上Log。按照,A1,A2,A1,A2的顺序启动Activity,注意的是此时A1和A2会放在不同的堆栈里,A1每次启动都会创建一个新的放在对应的堆栈里(如stack1),而A2第一次创建时放在对应的堆栈里(如stack2),再次启动A2时会在stack2里寻找是否又A2,找到后直接开启而不再创建新的A2。所以此时如果按返回键退出这些Activity,A2退出后系统把A2从stack2里移除掉,此时stack2里一无所有,只剩下stack1里的两个A1,所以就是连续退出两个A1的情况。
复习就到这里,有任何不足之处,希望高手指出,谢谢。