activity|android Activity4种启动模式及其特点

之前做项目时遇到了activity启动模式的问题,一直想要总结下,今天将总结的知识点与大家分享下,如有不足欢迎斧正。
activity启动模式分为四种,standard,singleTop,singleTask和singleInstance。这四种模式是在AndroidManifest.xml清单中设置,例如:

android:name=".hpage.MainActivity" android:launchMode="singleTask" />


当然也可以在代码中设置,通过在intent中设置标志位来为activity指定启动模式
Intent intent=new Intent();
intent.setClass()
intent.addFlags()


【activity|android Activity4种启动模式及其特点】1.standard:标准模式,也是系统默认模式,(如果没有在清单设置launchMode则此activity的启动模式为标准模式。)
即每次启动一个acticity都会创建一个新的实例,无论这个实例存在与否。在这种模式下,谁启动了这个activity那么这个activity就运行在启动它的那个activity所在的栈里,注意:当我们用ApplicationContext去启动activity是会报错,那是因为ApplicationContext非activity类型的Context并没有所谓的任务栈,解决这个问题是为待启动的activity指定FLAG_ACTIVITY_NEW_TASK标记位。这时候启动的时候会为它创建一个新的任务栈,相当于被启动的activity是以singleTask模式被启动的。
2.singleTop:栈顶复用模式。在这种情况下如果任务栈中已经存在此实例,并且其已位于栈顶,则不会创建新的实例,并且不会调用其onCreate方法,会调用其onNewIntent方法。如果新activity已存在与任务栈中但是不处于栈顶,或者任务栈中并没有其实例,则会创建新的实例。
3.singleTask:栈内复用模式。这是一种单实例模式,只要activity在一个栈中存在,那么多次启动次activity都不会重新创建实例,和singleTop一样,系统也会回调其onNewIntent。具体过程是 ,当一个activity的启动模式为singleTask,启动它时,比如acticity A,系统会首先寻找是否存在A想要的任务栈,如果不存在,就重新创建一个任务栈,然后创建A的实例,并把A放到栈中。如果存在A所需的任务栈,这时要看A是否在栈中有实例存在,如果有实例存在,那么系统就会把A调到栈顶并调用它的onNewIntent方法,如果实例不存在,就创建A的实例并把A压入栈中。并且会将栈内位于其上的activity弹出栈。
4.singleInstance:单实例模式。这是一种加强的singleTask,具有singleTask模式的所有特性。并且具有此种模式的activity只能单独的位于一个任务栈中。从名字中可以得出,‘单一’即当前的栈中只能有目标Activity一个Actvitiy,不能再有别的Activity。每次启动一个新的acticity都会创建一个新的栈,并且创建新的实例。


在singleTask启动模式中常说的任务栈,通过TaskAffinity可以已表识一个activity所需要的任务栈的名字,默认情况下所有activity所需的任务栈的名字为应用的包名。


    推荐阅读