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都清除掉。

结束。

转载于:https://www.cnblogs.com/mengfanrong/p/3795316.html

Android中关于Task的一些认识相关推荐

  1. Android中的APK,TASK,PROCESS,USERID之间的关系

    开发Android已经有一段时间了,今天接触到底层的东西,所以对于进程,用户的id以及Android中的Task,Apk之间的关系,要做一个研究,下面就是研究结果: apk一般占一个dalvik,一个 ...

  2. 【Android 返回堆栈管理】打印 Android 中当前运行的 Activity 任务栈信息 | Activity 任务栈信息分析 | Activity 在相同 Stack 中的不同 Task

    文章目录 一.打印 Android 中当前运行的 Activity 任务栈信息 二.Activity 任务栈信息分析 三.Activity 在相同 Stack 的不同 Task 情况 一.打印 And ...

  3. 关于Android 中的Activity,Application和Task

    什么是Android  Application? 简单来说,一个apk文件就是一个Application. 任何一个Android Application基本上是由一些Activities组成,当用户 ...

  4. Android中的“Application”,“Task”,“Activities”的关系

    Android中的"Application","Task","Activities"的关系 什么是Android  Application? ...

  5. android怎么模拟返回,Android中障蔽返回键,HOME键以及模拟HOME键返回效果的方法...

    Android中屏蔽返回键,HOME键以及模拟HOME键返回效果的方法 在Android开发中,有时需要屏蔽一些实体的按键,如HOME键,返回键等实体的按键,实现的方法如下. 1. 屏蔽实体按键 屏蔽 ...

  6. Android中对Handler用法的总结

    Android之Handler用法总结 方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用 ...

  7. Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)

    本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等.应用程序/包.服务(Serv ...

  8. Android中 AsyncTask

    Android AsyncTask 在程序处理中必然会遇上耗时的操作,如访问网络,下载数据,访问数据库等,如何存在耗时的操作 又不能影响界面显示交互. 在某些耗时可以控制的情况下,我们可以分批操作,对 ...

  9. Android中的线程处理

    注:本文来自CSDN博主的一篇文章,个人觉得写得很好,值得借鉴,故收录在此 Android进程模型 在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应 ...

  10. android中的定时任务一般有两种机制,android 定时任务

    使用timertask进行定时任务 首先创建TimerTask: class SynchroTimerTask extends TimerTask { @Override public void ru ...

最新文章

  1. 横竖屏切换时Activity的生命周期
  2. mysql返回查询条件_mysql条件查询
  3. c++局部对象是什么_面向对象三大特征: 封装
  4. 对Mapreduce代码进行单元测试
  5. TCP选项:TCP_NODELAY和TCP_CORK
  6. C# 线程的各种知识,和使用方法
  7. 3 二分频verilog与Systemverilog编码
  8. VS2012下创建QT5应用程序
  9. PAT (Basic Level) Practice1005 继续(3n+1)猜想
  10. sql 字段很多怎么汇总_利用集算器实现分库汇总
  11. 隐藏nginx 版本号信息(转)
  12. 成功恢复UNIX误删除数据库文件(NODE已被清除)
  13. java计算机毕业设计户籍管理系统设计源程序+mysql+系统+lw文档+远程调试
  14. RAID磁盘阵列介绍
  15. win7怎么把计算机图标下的箭头掉,电脑快捷方式图标箭头怎么去掉?Win7系统去掉快捷方式箭头的方法...
  16. 华为mate7android版本,华为Mate7升级安卓6.0(EMUI4.0)M版本详细图文教程
  17. Mapper method 'comxx' has an unsupported return type
  18. 百度蜘蛛爬行日志分析
  19. 简述c语言中break的作用,c语言break什么意思?
  20. [bzoj5473] 仙人掌

热门文章

  1. 复制和粘贴文本时剥离格式的5种方法(MacWindows)
  2. 在spring boot中3分钟上手RPC框架Dubbo
  3. 一体化方案解决大数据处理的两个难题
  4. Mac 终端失效如何解救
  5. Mac SourceTree使用
  6. Ubuntu 分卷压缩和解压
  7. GitHub又出新功能了,网友:这也太爽了吧。。。
  8. 用 Java 爬小姐姐图片,直接拿来用!这个厉害了。。。
  9. Java 正则表达式处理复杂文本,效率就是高!
  10. 微信支付宝神仙打架,谁家健康码能一统天下?