原由:因为Activity 都是由Task(栈)来管理的,1任务栈和2返回堆栈
-
android:launchMode="standard"可以存在多个实例,这是默认的启动模式,系统总是会在目标栈中创建新的activity实例。
-
android:launchMode="singleTop"如果这个 activity 实例已经存在目标栈的栈顶,系统 会调用这个 activity 中的 onNewIntent()方法,并传递 intent,而不会创建新的 activity 实例 ;如果不存在这个 activity 实例或者 activity 实例不在栈顶,则 SingleTop 和 Standard 作用是一样的。
-
android:launchMode="singleTask"不会存在多个实例,如果栈中不存在 activity 实例,系统会在新栈的根部创建一个新的 activity; 如果这个 activity 实例已经存在,系统会调用这个 activity 的 onNewIntent() 方法而不会创建新的 activity 实例 。
-
android:launchMode="singleInstance"这种启动模式比较特殊,因为它会启用一个新的栈结构,将 Acitvity 放置于这个新的栈结构中, 并保证不再有其他 Activity 实例进入 ,除此之外,SingleInstance 模式和 SingleTask 模式是一样的。
为什么要有启动模式?
因为在Android中,启动一个Activity有时需要创建一个新的对象,有时需要复用已有的对象
①standard:标准模式、默认模式
含义:每次启动一个Activity就会创建一个新的实例。
注意:使用ApplicationContext去启动standard模式Activity就会报错。因为standard模式的Activity会默认进入启动它所属的任务栈,但是由于非Activity的Context没有所谓的任务栈。
生命周期:
每次被
创建的实例Activity 的生命周期符合典型情况,它的
onCreate、
onStart、
onResume都会
被调用。
应用场景:应用与大多数的Activity
②singleTop:栈顶复用模式
含义:分两种处理情况:需要创建的Activity已经处于栈顶时,此时会直接复用栈顶的Activity。不会再创建新的Activity;若须要创建的Activity不处于栈顶,此时会又一次创建一个新的Activity入栈,同Standard模式一样。
生命周期:若情况一中栈顶的Activity被直接复用时,它的onCreate、onStart不会被系统调用,由于它并没有发生改变。可是一个新的方法 onNewIntent会被回调(Activity被正常创建时不会回调此方法)。
应用场景:假设你在当前的Activity中又要启动同类型的Activity,此时建议将此类型Activity的启动模式指定为
SingleTop,能够降低Activity的创建,节省内存!
③singleTask:栈内复用模式
含义:若须要创建的Activity已经处于栈中时,此时不会创建新的Activity,而是将存在栈中的Activity上面的其他Activity所有销毁,使它成为栈顶。
生命周期:同SingleTop 模式中的情况一同样。仅仅会又一次回调Activity中的 onNewIntent方法
应用场景:
保持我们应用开启后仅
仅有一个
Activity的实例。最典型的样例就是应用中展示的主页(Home页)。
假设用户在主页跳转到其他页面,运行多次操作后想返回到主页。
④singleInstance:全局单例模式
含义:是全局单例模式,是一种加强的SingleTask模式。它除了具有它所有特性外,还加强了一点:具有此模式的Activity仅仅能单独位于一个任务栈中。
应用场景:这个经常使用于系统中的应用,比如Launch、锁屏键的应用等等,整个系统中仅仅有一个!所以在我们的应用中一般不会用到。