Android四种启动模式:
一. Standard 标准模式
定义:
每次启动Activity都会创建一个新的实例入栈,无论这个实例是否存在(这是Activity默认的启动模式,如果没有设置启动模式,默认使用该模式。)。
举例:
我们在从ActivityA中点击跳转到ActivityB,再从ActivityB中跳转到ActivityB,这时候返回时需要点两次才能返回到ActivityA,说明
ActivityB启动了两次,即每次启动都会创建一个新的页面,即使ActivityB已经存在。
二. SingleTop 栈顶复用模式
定义:
跳转时系统会先在栈结构中查找是否已经有一个需要启动的Activity位于栈的顶部,如果有就直接使用,不再生成新的。
举例:
这时我们把ActivityB设置成SingleTop模式:android:launchMode=“singleTop",
1.现在我们增加ActivityB,并在ActivityB中的onCreate()方法和onNewIntent方法中分别打印log,我们一样从ActivityA中点击跳转到ActivityB,再在ActivityB中跳转ActivityB,我们连续多次点跳转按钮,这时候看log:
发现onCreate方法只在第一次点的时候有执行,后面点击都执行的是onNewIntent,然后点返回时只要点击一次就返回到ActivityA了,这就是因为当ActivityA跳转到ActivityB时创建了ActivityB实例,并位于栈的顶部(栈是一种“后进先出”的数据结构),这时候再从ActivityB点击跳转时,就不会再创建新的实例(但是会调用onNewIntent方法),直接拿来用了。
2.现在我们增加ActivityC,跳转顺序改成:ActivityA->ActivityB->ActivityC->ActivityB->ActivityC->ActivityB
这时候看log:
这时候发现ActivityB每次都执行onCreate方法,这就是因为ActivityB从ActivityC跳转回来时已经不是位于栈顶了,所以每次跳转回来都会创建新的实例。
三. SingleTask 栈内复用模式
定义:
跳转时系统会先在栈结构中是否已经有一个需要启动的Activity位于栈中,如果有就将栈中其他activity移除栈,使它位于栈顶,并使用它。
举例:
这时我们把ActivityB设置成singleTask模式:android:launchMode=“singleTask",
现在我们使用两种跳转顺序:
1.ActivityA->ActivityB->ActivityB->ActivityB->ActivityB->ActivityB
2.ActivityA->ActivityB->ActivityC->ActivityB->ActivityC->ActivityB
这时候我们发现两种跳转顺序打印的log都是一样的,都是在第一次跳转是执行onCreate后面都只执行onNewIntent,这就是因为SingleTask模式只要实例存在栈中,不管是否位于栈顶都不会重新创建。
四. SingleInstance 单实例模式
定义:
Android四种启动模式分析SingleInstance比較特殊,是全局单例模式,是一种加强的SingleTask模式。它除了具有它所有特性外,还加强了一点:具有此模式的Activity仅仅能单独位于一个任务栈中。
这个模式一般是用于系统应用中如Launch、锁屏键,我们应用少用这里不做过多解释。