您的位置:首页 > 移动开发 > Android开发

Android中关于Task的一些认识

2014-04-21 10:54 337 查看
Android中Task是一个逻辑上的概念,简单地说,就是一个栈里面顺序存储着的多个Activity。这些Activity可以是来自同一个App,也可以是来自不同的Apps。

Task的创建

比如之前的一个Todo List的Demo,当它被安装到手机上之后,在应用程序列表,也即Launcher中,会有一个图标显示,如果长按这个图标,还能为其在桌面上创建一个快捷方式。

当点击这个图标,或者快捷方式,Todo List中入口的Main Activity就会被创建,而与此同时,一个Stack也会被创建,然后,Activity会被放到这个Stack中。

当Main Activity,点击列表项,Detail Activity会创建,也被放到Stack中。

当在Detail Activity中点击“查看图片”进入Image Activity,Image Activity也被放入Stack中,

而当Image Activity,通过Intent,调用系统中另外一个App(照相机)去获取照片时,它调用的其实是照相机App中的一个Activity,在默认这个情况下,这个Activity也是被放在当前的Stack中。
上面的这个流程如下图所示:



这样的一系列Activity的顺序组合,在Android中的概念就是一个Task。通俗地说,它表示了一个App顺序提供的功能展示,包括其调用其他App的功能。

Task的结束

而当用户点击Back键,或者ActionBar上的返回键的时候,当前的Activity就会从Stack中被弹出来,然后销毁,这样一直返回,最后最开始的Activity,在上例中是

Main Activty,也会被从stack中弹出来,并消毁,而结果就是回到桌面上,当最后一个Activity从stack中退出的时候,stack也被销毁了,那么一个Task也就没有存在的意义了。

那么此时就不存在Task了。

Task的切换

所以从Launcher中或者快捷方式启动一个App的时候,如果这个App最近没有被启动过,那么就会创建一个新的Stack,从而启动一个新的Task。

Home应用,也是一个Task,当用户点击Home键的时候,屏幕就会跑到桌面,也就是说,当前的Task被停止了,而切换到了Home所在的Task。

此时,原来显示在屏幕上的Task就会被转移到后台,在用户看不见的屏幕的深处,在那里,Task中的所有Activity都会处于stop状态,但是所有的内容和状态都会被保存。

当从Launcher中,或者快捷方式,再去点击应用的图标的时候,处于后台的Task又会被带到屏幕上显示,用户可以继续操作,而Home应用所在的Task就被切换到后台。

所以在用户看着屏幕的时候,在屏幕后面那些不可见的虚拟空间中,可能同时存在着多个Task,静静地呆着,等待着随时被带到屏幕上展示。

上面所述的处理,都是在Android中默认的情况下发生的。在这种情况下,当创建一个Activity,就会往Stack中放一个Activity,当返回上一个Activity,当前的Activity就会被移除

并消毁,而Task可以同时存在多个相同的Activity。

当然,Android也提供了一些属性或者标志来让用户去修改默认的处理行为,虽然Android的开发团队并不建议这样做,因为大多数的情况下,运用默认的机制已经可以很好满足App的需要。

Launch Mode

Launch Mode是Android提供的在AndroidManifest中,<activity>元素上所提供的属性,它有以下四个值:

1)standard 

这是launcher Mode的默认值,也就是上述的情况。

2)singleTop

SingleTop是为了保证相同的Activity,只有一个实例处于Stack的顶端,比如,在默认情况下,如果Stack中的Activity是A->B->C->D,如果在D中又利用Intent打开一个D的Activity,那么Stack中就会是这样的序列,A->B->C->D->D。

如果在D的activity中设置下面的属性,
android:launchMode="singleTop"
那么就Intent就会被当前Activity(即D)的onNewIntent的方法接收然后进行处理,那么在

Stack中的序列就还是跟原来一样,即 A->B->C->D。

而在实际中的例子,就有可能存在这样一种情况,在ListView上快速地点击Listitem,因为没有处理DoubleClick事件,或者自己改写了onTouch事件,那么可能这两次点击都会触发

同一个itemClick事件,从而导致打开两个同样的Activity,如 A->B->B,那么在B中回退的时候,发现还是回到B,要再返回一次才是回到A,那效果就会很诡异了。

这种情况下,就可以通过singleTop属性来避免这样的失误。

3)singeTask

如果Activity中设置launchMode的属性为SingleTask,则Activity会被创建的时候,首先会检查有没有存在一个Task中有这样一个Activity,如果有的话,那么Android会直接将

Intent路由到那个Activity,也是通过其onNewIntent方法进行处理,而如果不存在这样的一个Task,那么Android会创建一个新的Stack,然后将Activity放进去作为Stack。

在这里会存在一种情况,如果已经存在一个Task中有这样的一个Activty,如果这个Activity其上面还有Activity,即不是处于栈顶的话,那么其上面的Activity都会被销毁。

而如果其下面还有Activity的话,它及它下面的所有Activity都会被带到当前的Task中,也就是说,如果在这个Activity上面按返回键的话,返回的并不是打开这个Activity的Activity,
而是其原先栈中下面的Activity。图示如下:



4)singleInstance

这种情况下跟SingleTask是一样的,所不同的是其所创建的或者所寻找到的Task只能有要启动的Activity,且只能有这么一个。

上面四种情况是通过在AndroidManifest文件中设置activity的launchMode属性的。

Intent Flag

在代码中通过StartActivity来启动下一个Activity的时候,可以通过设置Intent的Flag来修改默认的Task管理标志,如下:

Intent intent = new Intent(MainActivity.this, DetailActivity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

Flag的值有以下三个:

1)FLAG_ACTIVITY_NEW_TASK

    这个值跟LaunchMode中的SingleTask的效果是一样的。

2)FLAG_ACTIVITY_SINGLE_TOP

    这个值跟LaunchMode中的SingleTop的效果是一样的。

3)Flag_ACTIVITY_CLEAR_TOP

    当Intent设置了这样一个标志,那么Android就会去寻找一个存在的Activity,如果找到了,其上面存在有其他Activity的话,就会将其上面的所有Activity都清除掉。

结束。

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息