Android的activity有4种启动模式,但要理解启动模式就不得不先理解安卓的任务栈概念。
一、任务栈
每个安卓APP启动时都会创建至少一个空的任务栈来存储众多的Activity,任务栈实际上和数据结构里的栈结构是一样的“先进后出”结构,用户看到的页面都是位于任务栈最上方的那个Activity加载的页面。默认情况下,也就是用户不设置的情况下,activity的启动方式是Standard模式。下面我们开始聊第一个启动模式。
二、启动模式
一、standard模式
standard模式允许一个任务栈中存放重复的Activity,每跳转或者创建一个新的activity都会生成一个新的activity覆盖在栈顶端让用户看到。当返回页面时最上端的弹出栈外销毁掉,用户看到的是第二个页面,不断按返回键时,依次弹出栈外,最后空栈也会被回收掉。
(1)举例说明:A、B、C三个页面按左边进入栈内,跳转到A立刻生成Activity覆盖在上面。
(2)假设C已经在栈顶,此时跳转到C的情形。
这种模式的缺点也看出来了,如果有个页面重复被显示的话,那么用户按下返回键时很奇怪,怎么刚刚才关掉了C页面,怎么又出现了呢?因此有必要修改模式或者离开某个页面就关掉它。
二、singleTop模式。也允许出现重复的活动实例,分为两种情况,页面不在栈顶和页面已经在栈顶的情况。
(1)页面不在栈顶。此时还是和standard一样重新生成一个新的activity实例。
(2)页面在栈顶。此时直接使用栈顶的这个活动实例,不会重新生成新的。
三.singleTask模式。不会出现重复的活动实例,这种模式下至于两种情形,栈内有这个活动的实例的情形和栈内没有这个实例的情形。
(1)假设站内原来有A、B两个实例,此时跳转到A页面,不管A页面位不位于栈顶,只要栈内存在A活动的实例,那么就把A以上的实例全部销毁出栈,总之让A位于栈顶得到用户观看。
(2)假设栈内没有C,此时跳转到C页面,会创建新的C活动实例。
四、singleInstance模式。不会出现重复的活动实例,此时比较特殊,持有这种模式的活动实例单独有一个栈来存储它,栈内只有它一个实例,如果多个应用启动这个活动,那么他们共同享用这个栈内的唯一实例,不会生成新的。这个模式的应用比如说手机的锁屏页面。
这种模式的返回模式,出栈顺序是C-B-A,入栈顺序是A-B-C,最先出现,最后死亡,活得最长久的人,哈哈。
下面说说怎么设定这四种模式,有两种方法,一种是在android的manifest.xml文件中设置。
<</span>activity android:name=".Activity1"
android:launchMode="standard"
android:label="@string/app_name">
<</span>intent-filter>
<</span>action android:name="android.intent.action.MAIN" />
<</span>category android:name="android.intent.category.LAUNCHER" />
</</span>intent-filter>
</</span>activity
另一种是在启动意图时设置,intent.FLAG_ACTIVITY_SINGLE_TOP.这里不做详细讲述。
FLAG_ACTIVITY_SINGLE_TOP
这个FLAG就相当于加载模式中的singletop,比如说原来栈中情况是A,B,C,D在D中启动D,栈中的情况还是A,B,C,D
FLAG_ACTIVITY_CLEAR_TOP
这个FLAG就相当于加载模式中的SingleTask,这种FLAG启动的Activity会把要启动的Activity之上的Activity全部弹出栈空间。类如:原来栈中的情况是A,B,C,D这个时候从D中跳转到B,这个时候栈中的情况就是A,B了.