Android笔记二:Activity启动模式

Activity启动模式

我们多次开启同一个Activity时候,系统会创建多个实例一一放入任务栈中,任务栈时先进后出,依次按back键退出时,Activity会一一退出,直至任务栈为空后被系统回收。但是一一退出同一个Activity多次其实不合理,所以就有Activity的四种启动模式:standard,singleTask,singleInstance和singleTop。

<activity android:name=".MainActivity" android:launchMode="standard" />

一、Activity四种模式

1.standard:标准模式

默认的activity的启动方式, 每次启动Activity都会创建一个实例在开启他的Activity所在的任务栈中,一个任务栈可以有多个实例,每个实例也可以属于不同的任务栈。比如Activity A启动了Activity B(标准模式),那么B就会运行在A所在的任务栈中。有没有注意到一个现象,当用ApplicationContext去启动standard模式的Activity时会报错:
这里写图片描述

这是因为standard模式的Activity会在开启他的Activity所在的任务栈,但是ApplicationContext是非Activity的Context,所以不在任务栈中,因此报错。解决方案:为待开启的Activity指定FLAG_ACTIVITY_NEW_TASK(首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈,如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity)标记位。因为这样就会创建一个新的任务栈,这个时候Activity启动的模式相当于singleTask。

2.singleTop:栈顶复用模式

在这种模式下,如果Activity已经位于栈顶,则不会重新创建新的Activity,复用栈顶的这个Activity,并且会调用onNewIntent函数,不会调用onCreate等函数,因为这个activity没有改变。如果这个Activity已经存在且不在栈顶,则会创建新的Activity,这个情况下和standard模式一样。
Android笔记二:Activity启动模式_第1张图片

Android笔记二:Activity启动模式_第2张图片

3.singleTask:栈内复用模式

如果在这种模式下,如果Activity在这个任务栈中存在该activity,多次启动activity都不会创建新的activity,都会复用该activity,并且将该activity至于栈顶,把它之上的所有activity都pop(singleTask默认具有clearTop效果),并且会调用onNewIntent函数。如果他不在任务栈中,那就重新创建新的activity,并且至于任务栈的顶部。

Android笔记二:Activity启动模式_第3张图片

Android笔记二:Activity启动模式_第4张图片

4.singleInstance:单实例模式

此种模式的Activity只能单独位于一个任务栈中,并让多个任务栈共享这个activity,任何任务栈想要激活activity时都会复用该任务栈的activity。此启动模式类似打开浏览器,多个程序访问浏览器时,如果浏览器没有打开,则打开浏览器,否则会在当前打开的浏览器中访问。此模式会节省大量的系统资源,因为他能保证要请求的Activity对象在当前的栈中只存在一个。
Android笔记二:Activity启动模式_第5张图片

二、指定Activity启动模式方式

1.AndroidMenifest指定

<activity
    android:name="com.lynnlee.MainActivity"
    android:configChanges="screenLayout"
    android:launchMode="singleTask"
    android:label="test" />

2.代码方法指定

通过Intent中设置标志位来指定Activity启动方式。

Intent intent = new Intent(this,MainActivit.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

第一种设置启动模式优先级高,两种同时存在时,以第二种方式为准。

你可能感兴趣的:(android基础)