浅谈Android的任务栈和activity的启动模式

     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了.

猜你喜欢

转载自my.oschina.net/u/3630543/blog/1632755