Activity的启动模式
一、概述
Android供给了四种发动方法,分别是:
规范方法(Standard)
栈顶复用方法(SingleTop)
栈内复用方法(SingleTask)
单例方法(SingleInstance)
下面依次介绍每种方法的特色,首先了解什么是task,t* t 2ad c L 7 e ` – % 7sk翻U H W l e 9 !译过来就) i Z 6 Y a是“使命”,是一组彼此有相关的Activity调集,可以理解为Activity是在task里边活动的。task存在于一个称为back stack的数据结构中,也就是说,task是以
栈的方法去办理Activity的,所以也叫可以称为“使命栈”。综上所述:“使命栈”是Activity的办理方法,采用的是“后进先出”的栈结构,每按一次Back键,就会有一个Activity出栈
二、四种发动方法具体特色
(一)g H y F R G j QStandard
规范方法,也是体系默许的发动方法,该方法特色:
-
每发动一次Activity,都会创立一个新@ E u ; N的Activity实例在栈顶,不论这个实例在使命栈中是否已经存在。假设 Acg W , Rtivity A发动了 Activity B,Activity B则会运行在Activityc B ^ i 3 ~ 1 A地点的使命栈中并处于栈顶位置。
-
非Activityd / |类型的context(如ApplicationContext)发动staC $ . @ S sndard方法的Activitp ) e ) D ^ S G `y时会报错。因为非Activity类型 context 并没有使命栈,故无法采用规范方法发动Activity。解决办法可认为待发动Activity指定 FLAG_ACTIVIT& ( $ 9 CY_NEW_TASK符号位,这样发动的时分体系就会为它创立一个新m W U E 6 L k g l的使命栈。实n d 1 D际上待发动Activity是采用singleTask方法发动的。
(二)SingleTop
栈顶复^ : { s用方法,该方法特色:
-
若需求新建的Activity坐落使命栈栈顶,那么此^ ] WActivity的实X 3 + ` 1 h Z _例就不会从头创立,而是复用栈顶的实例。调用A? p ? Activity的onNewIntent()办法不会调用onCreate()和on` z ,Start()办法。
-
假设Activity A发动Activity B,就会判断A地点的使命栈栈顶是否是B的实例。假如是,则不创立新的Activity B 实例而是直接引用栈顶实例,一起onNewI $ 2Intent()办法会被回调,经过该办法的参数可以获得当时请求的信息;x 5 w ] C b Q假如不是,则创立新的Activity B实例。
(三)SingleTask
栈内复用方法,该方法特) 9 Z o l & 5 J k色:
. 查看Activity想要的使命栈是否存在(经过查找Activity的taskAffid $ = x c h a xnity特色2 _ ~ o O S }值相匹配的使命栈是否存在),若不存在,则新建一个使命栈并创立该Activity实例压入栈中;若存在,则查看Activity是否在该栈中,若在,则将该Activity实例之上的一切Activity实例出栈,使该Activity实例置于栈顶,执行回调函数onNewIntent()办法i p [ –。若不在,则创立该Activih g tty实例并压入栈中。
- taskN ^ _ , v ]Affinity是在Androidma : ^ ? 9nifest文件中的一个重要特色,这个参数标识了一个Activity所需求的使命栈的姓名。默许情8 3 a J 8况下,一切Activity所需的使命栈的姓名为使用的包名。taskAffinity特色主要和singleTask发动方法或者allowTaskReparenting特色配对使用。

(四)SingleInstance
单实例方法,该方法特色:
-
这个是singleTas方法的加强版,它除了具有singleTask方法的一切特性外,它还有一点独特的特性,那就是此方法的Activity只能单独地坐落一个使命栈,不与其 Activity共存于同一个使L + N W命栈。
-
直接创立一个新的使命栈并创立该Activity实例压入栈中。
三、发动方法的设置
两种办法能给Activity指定发动方法:
- 在AndroidMainifest设置LauncY f , ) e @hMode
- 经过Intent设置标志位Intent Flag
(一)在AM n e F v nndroidMainifest设置LauN n . e d *nchMode
&B ~ G u } e ^lt;activity
androidu d , Z :name=".MainActivity"
androi? l n * 3 K bd:launchMode="singleTask">
</activity>
(n & P E P [ Y 4二)经过Intent设置标志位Intent Flag
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
intent.addFlags(Intent.FLAG_J Q I . ~ ~ ( p )ACTIVITY_NEW_TASK);
startActivity(intent);
常用Activity的_ ; G标志位Flags有:
标 志 位 | 作 用 |
---|---|
FLAG_ACTIVITY_SINGLE_TOP | 指定发动方法为栈顶复用方法(SingleTop) |
FLAG_ACTIVITY_CLEAR_TOP | 在同一个使命栈中,一切坐落它上面的Activity都要出栈。在下面详细介绍下 |
FLAG_ACTIVITY_NEW_TASK | 指定发动方法为栈内复用方法(SingleTask) |
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | 具有这个符号的Activity不会出现在前史Activity的列表中,即无法经过前史列表回到该Activity中,它等同于在XML中指定Activity 的r A 8 # y y ,特色 android:excludeFro F 4 ) 1omRecentF C x F J o { .s=”true” |
FLAG_ACTIVI? y dTY_CLEAR_TOP
假如该Activity已经在存在使Y * c _ ^命栈中,体系会将同一个使命栈中,该ActivitY / ( N E * l 8 @y之上的一切Acti? H 1 Fvity都出栈,然后将Intent发给这个已存在的Activity,该Acta n = D F ivity收到Intent之后,X p { % A执行V + c 回调onNewIntent()办法或者自行结束然后从头创立自己。
- 假如该ActiW v 4 L E p Jvity在AndroidMainifest.xml里将发动方法设置成默许standard方法

- 假如该Activity在AndroidMainifest.xml里将发动方法设置成默许singleTop方法

- 假如该Activity在AndroidMainifest.xml里将发动方法设置成默许sin` ; : +gleTask方法

(三)二者的差异= O t 7 ;
-
优先级不同:Intent设置方法的优先级 > Manifest设置方法,即以前者为准
-
限制范围不同Manifest设置方法无法设定FLAh & S e ] 0 V /G_ACTIVITY_CLEAR_T/ L #OP;Intent设置方法无法设置单例方法(SingleInstance)
四、总结
本文介绍了Activity的四种发动方法(standard、singl3 = – T 3 ` _ ,eTop、singleTask、singleNewInstance)和设置发动方法的办法(launQ A – } . 5 1 ;chMode、Intent_Flag)