前言
一直知道Activity有几种启动模式,但一直模糊不清,不是从头去查找相关资料,还真不知道每一种之间到底是什么区别。
概念
栈是一种常用的数据结构,栈只允许访问栈顶的元素对于栈就只能每次访问它的栈顶元素,从而可以达到保护栈顶元素以下的其他元素.”先进后出”或”后进先出”就是栈的一大特点,先进栈的元素总是要等到后进栈的元素出栈以后才能出栈.递归就是利用到了系统栈,暂时保存临时结果,对临时结果进行保护.
- standard 标准模式,每次都新建一个实例对象
- singleTop 如果在任务栈顶发现了相同的实例则重用,否则新建并压入栈顶
- singleTask 如果在任务栈中发现了相同的实例,将其上面的任务终止并移除,重用该实例。否则新建实例并入栈
- singleInstance 允许不同应用,进程线程等共用一个实例,无论从何应用调用该实例都重用
分析
- standard
Activity的默认加载方法,该方法会通过跳转到一个新的activity,同时将该实例压入到栈中(不管该activity是否已经存在在Task栈中,都是采用new操作)永远不会调用onNewIntent().
例如:栈中顺序是A B C D ,此时D通过Intent跳转到A,那么栈中结构就变成 A B C D A ,点击返回按钮的 显示顺序是 D C B A,依次摧毁
- singleTop
singleTop模式下,调跳转的Activity位于栈顶,则不会重新创建一个新的实例并调用其onNewIntent(),否则会创建一个新的实例压入栈顶而不会调用onNewIntent()。
例如:栈中的结构依为A B C D,这时候跳转到D,D不重新被创建,栈中结构依然是A B C D。如果调整到B,会创建一个B实例,这时候栈中结构为A B C D B。
- singleTask
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中(此时不会调用onNewIntent())
例如:现在栈的结构为:A B C D。此时D通过Intent跳转到B,则栈的结构变成了:A B。其中的C和D被栈弹出销毁了,也就是说位于B之上的实例都被销毁了
- singleInstance
singleInstance模式下,会将打开的Activity压入一个新建的任务栈中。并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。这里可以理解为调用系统默认浏览器跳转到浏览器页面。
例如:Task栈1中结构为:A B C ,C通过Intent跳转到了D(D的模式为singleInstance),那么则会新建一个Task栈2,栈1中结构依旧为A B C,栈2中结构为D,此时屏幕中显示D,之后D通过Intent跳转到D,栈2中不会压入新的D,所以2个栈中的情况没发生改变。如果D跳转到了C,那么就会根据C对应的launchMode的在栈1中进行对应的操作,C如果为standard,那么D跳转到C,栈1的结构为A B C C ,此时点击返回按钮,还是在C,栈1的结构变为A B C,而不会回到D。
Intent Flags
Flags: 表示Intent的标志位,常用于Activity的场景中,它和Activity的启动模式有着密切的联系
Intent.FLAG_ACTIVITY_NEW_TASK(默认)
默认的跳转类型,它会重新创建一个新的Activity,如果是默认的或者指定的Affinity和Task一样的话,就和标准模式一样了启动一个新的Activity.
FLAG_ACTIVITY_SINGLE_TOP
这个FLAG就相当于启动模式中的singletop
FLAG_ACTIVITY_CLEAR_TOP
这个FLAG就相当于启动模式中的SingleTask
FLAG_ACTIVITY_NO_HISTORY
意思就是说用这个FLAG启动的Activity,一旦退出,它不会存在于栈中,比方说!原来是A,B,C这个时候再C中以这个FLAG启动D的,D再启动E,这个时候栈中情况为A,B,C,E。