Android中关于Task的一些认识
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都清除掉。
结束。
Android中关于Task的一些认识的更多相关文章
- Android中的task和stack
今天在重新理了一遍intent的过程中发现task是一个神奇的东西,而它又和stack有着很深的联系.task顾名思义是一个任务,但是这个任务可不一定只是来自一个app,比如我用微信来发一张图片,那么 ...
- Android中与task相关的几个属性
1.与任务相关的属性 taskAffinity :修改任何给定Activity的关联 系统使用包名标识应用的默认任务关联: taskAffinity属性取字符串值,必须不同于包名: taskAffin ...
- Android中的APK,TASK,PROCESS,USERID之间的关系
开发Android已经有一段时间了,今天接触到底层的东西,所以对于进程,用户的id以及Android中的Task,Apk之间的关系,要做一个研究,下面就是研究结果: apk一般占一个dalvik,一个 ...
- Android 中如何计算 App 的启动时间?
(转载) 已知的两种方法貌似可以获取,但是感觉结果不准确:一种是,adb shell am start -w packagename/activity,这个可以得到两个值,ThisTime和Total ...
- Android中Activity的启动模式
简介 Android中的活动启动方式分为4种:standard, singleTop, singleTask, singleInstance.可以在AndroidManifest.xml中通过给< ...
- 详解Android中AsyncTask的使用
在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更 ...
- Android中GPS定位的简单应用
在Android中通过GPS获得当前位置,首先要获得一个LocationManager实例,通过该实例的getLastKnownLocation()方法获得第一个的位置,该方法的说明如下: void ...
- iOS中的NSTimer 和 Android 中的Timer
首先看iOS的, Scheduling Timers in Run Loops A timer object can be registered in only one run loop at a t ...
- iOS 和 Android 中的后台运行问题
后台机制的不同,算是iOS 和 Android的一大区别了,最近发布的iOS7又对后台处理做了一定的更改,找时间总结一下编码上的区别,先做个记录. 先看看iOS的把,首先需要仔细阅读一下Apple的官 ...
随机推荐
- ZOJ 刷题记录 小黑屋 (`・д・´)
P1006:模拟 然而我的同余方程能过样例然而就是WA⊙﹏⊙b [已查明:扩展欧几里得算法出了很隐蔽的问题] int exGcd(int x,int y,int& a,int& b) ...
- POJ2104 K-th Number 静态区间第k最值 平方分割
干掉这道题的那一刻,我只想说:我终于**的AC了!!! 最终内存1344K,耗时10282ms,比起归并树.划分树以及其他各种黑科技,这个成绩并不算光彩⊙﹏⊙ 但至少,从最初的无数次TLE到最终的AC ...
- Codeforces 475 D.CGCDSSQ
题目说了a的范围小于10^9次方,可实际却有超过的数据...真是醉了 算出以f[i]结尾的所有可能GCD值,并统计: f[i]可以由f[i-1]得出. /* 递推算出所有GCD值,map统计 */ # ...
- 常见的iis日志代码!
2xx 成功 200 正常:请求已完成. 201 正常:紧接 POST 命令. 202 正常:已接受用于处理,但处理尚未完成. 203 正常:部分信息 — 返回的信息只是一部分. 204 ...
- yzoi1109&&viojs1042最小步数的一点看法——回文数
Description - 问题描述 有一天,雄霸传授本人风神腿法第一式:捕风捉影..............的步法(弟子一:堂主,你大喘气呀.风:你给我闭嘴.)捕风捉影的关键是换气(换不好就会大喘气 ...
- C#快速导入海量XML数据至SQL Server数据库
#region 将Xml中的数据读到Dataset中,然后用SqlBulkCopy类把数据copy到目的表中using (XmlTextReader xmlReader = new XmlTextRe ...
- H5相关
对于容器元素,尤其在做移动端产品时候,我们很自然会让其居中定位: .container { position: absolute; left: %; top: %; transform: transl ...
- php中函数前加&符号的作用分解
这篇文章主要介绍了php中的函数前加&符号的作用分解,其作用叫做引用返回,有点抽象,详细解释请看本文内容,需要的朋友可以参考下 (转载) php变量前面加&符号是什么意思就不用多说了 ...
- python模块之socket
43.python模块之socket: Python在网络通讯方面功能强大,学习一下Socket通讯的基本方式 UDP通讯: Server: import socket port=8081 ...
- iOS触摸事件处理--备用
主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块,(1)首先在视图的层次结构里找到能响应消息的那个视图.(2)然后在找到的视图里处理消息 ...