Android Task和Activity相关复习进程.docx
《Android Task和Activity相关复习进程.docx》由会员分享,可在线阅读,更多相关《Android Task和Activity相关复习进程.docx(12页珍藏版)》请在冰豆网上搜索。
![Android Task和Activity相关复习进程.docx](https://file1.bdocx.com/fileroot1/2022-10/24/e3ccfa49-7169-42bb-8ed8-89280b1fbb34/e3ccfa49-7169-42bb-8ed8-89280b1fbb341.gif)
AndroidTask和Activity相关复习进程
AndroidTask和Activity相关
1Task和Activity相关
作者:
xirihanlin 来源:
博客园 发布时间:
2010-06-0315:
36 阅读:
507次 原文链接 [收藏]
这段时间在做一个项目,发现对Task和Activity掌握的还是不牢固。
把相关知识整理在这里,方便查阅,有几个Flag没看明白啥意思,也没测试出来效果如何。
。
。
android:
allowTaskReparenting
用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)——“true”,表示能移动,“false”,表示它必须呆在启动时呆在的那个Task里。
如果这个特性没有被设定,设定到元素上的allowTaskReparenting特性的值会应用到Activity上。
默认值为“false”。
一般来说,当Activity启动后,它就与启动它的Task关联,并且在那里耗尽它的整个生命周期。
当当前的Task不再显示时,你可以使用这个特性来强制Activity移动到有着affinity的Task中。
典型用法是:
把一个应用程序的Activity移到另一个应用程序的主Task中。
例如,如果e-mail中包含一个web页的链接,点击它就会启动一个Activity来显示这个页面。
这个Activity是由Browser应用程序定义的,但是,现在它作为e-mailTask的一部分。
如果它重新宿主到BrowserTask里,当Browser下一次进入到前台时,它就能被看见,并且,当e-mailTask再次进入前台时,就看不到它了。
Actvity的affinity是由taskAffinity特性定义的。
Task的affinity是通过读取根Activity的affinity决定。
因此,根据定义,根Activity总是位于相同affinity的Task里。
由于启动模式为“singleTask”和“singleInstance”的Activity只能位于Task的底部,因此,重新宿主只能限于“standard”和“singleTop”模式。
android:
alwaysRetainTaskState
用来标记Activity所在的Task的状态是否总是由系统来保持——“true”,表示总是;“false”,表示在某种情形下允许系统恢复Task到它的初始化状态。
默认值是“false”。
这个特性只针对Task的根Activity有意义;对其它Activity来说,忽略之。
一般来说,特定的情形如当用户从主画面重新选择这个Task时,系统会对这个Task进行清理(从stack中删除位于根Activity之上的所有Activivity)。
典型的情况,当用户有一段时间没有访问这个Task时也会这么做,例如30分钟。
然而,当这个特性设为“true”时,用户总是能回到这个Task的最新状态,无论他们是如何启动的。
这非常有用,例如,像Browser应用程序,这里有很多的状态(例如多个打开的Tab),用户不想丢失这些状态。
android:
clearTaskOnLaunch
用来标记是否从Task中清除所有的Activity,除了根Activity外(每当从主画面重新启动时)——“true”,表示总是清除至它的根Activity,“false”表示不。
默认值是“false”。
这个特性只对启动一个新的Task的Activity(根Activity)有意义;对Task中其它的Activity忽略。
当这个值为“true”,每次用户重新启动这个Task时,都会进入到它的根Activity中,不管这个Task最后在做些什么,也不管用户是使用BACK还是HOME离开的。
当这个值为“false”时,可能会在一些情形下(参考alwaysRetainTaskState特性)清除Task的Activity,但不总是。
假设,某人从主画面启动了ActivityP,并从那里迁移至ActivityQ。
接下来用户按下HOME,然后返回ActivityP。
一般,用户可能见到的是ActivityQ,因为它是P的Task中最后工作的内容。
然而,如果P设定这个特性为“true”,当用户按下HOME并使这个Task再次进入前台时,其上的所有的Activity(在这里是Q)都将被清除。
因此,当返回到这个Task时,用户只能看到P。
如果这个特性和allowTaskReparenting都设定为“true”,那些能重新宿主的Activity会移动到共享affinity的Task中;剩下的Activity都将被抛弃,如上所述。
android:
finishOnTaskLaunch
用来标记当用户再次启动它的Task(在主画面选择这个Task)时已经存在的Activity实例是否要关闭(结束)——“true”,表示应该关闭,“false”表示不关闭。
默认值是“false”。
如果这个特性和allowTaskReparenting都设定为“true”,这个特性胜出。
Activity的affinity忽略。
这个Activity不会重新宿主,但是会销毁。
android:
launchMode
用于指示Activity如何启动。
这里有四种模式,与Intent对象中的ActivityFlags(FLAG_ACTIVITY_*变量)共同作用,来决定Activity如何启动来处理Intent。
它们是:
"standard"
"singleTop"
"singleTask"
"singleInstance"
默认模式是“standard”。
这些模式可以分成两大组别,“standard”和“singleTop”一组,“singleTask”和“singleInstance”一组。
具有“standard”和“singleTop”启动模式的Activity可以实例化很多次。
这些实例可以属于任何Task并且可以位于Activitystack的任何位置。
典型的情况是,它们会进入调用startActivity()的Task(除非Intent对象包含FLAG_ACTIVITY_NEW_TASK标志,在这种情况下会选择一个不同的Task——参考taskAffinity特性)。
相反的,“singleTask”和“singleInstance”只能启动一个Task。
它们总是位于Activitystack的底部。
甚至,设备一次只能拥有一个Activity的实例——只有一个这样的Task。
“standard”和“singleTop”模式只在一种情况下有差别:
每次有一个新的启动“standard”Activity的Intent,就会创建一个新的实例来响应这个Intent。
每个实例处理一个Intent。
相似的,一个“singleTop”的Activity实例也有可能被创建来处理新的Intent。
然而,如果目标Task已经有一个存在的实例并且位于stack的顶部,那么,这个实例就会接收到这个新的Intent(调用onNewIntent());不会创建新的实例。
在其他情况下——例如,如果存在的“singleTop”的Activity实例在目标Task中,但不是在stack的顶部,或者它在一个stack的顶部,但不是在目标Task中——新的实例都会被创建并压入stack中。
“singleTask”和“singleInstance”模式也只在一种情况下有差别:
“singleTask”Activity允许其它Activity成为它的Task的部分。
它位于Activitystack的底部,其它Activity(必须是“standard”和“singleTop”Activity)可以启动加入到相同的Task中。
“singleInstance”Activity,换句话说,不允许其它Activity成为它的Task的部分。
它是Task中的唯一Activity。
如果它启动其它的Activity,这个Activity会被放置到另一个task中——好像Intent中包含了FLAG_ACTIVITY_NEW_TASK标志。
android:
noHistory
用于标记当用户从Activity上离开并且它在屏幕上不再可见时Activity是否从Activitystack中清除并结束(调用finish()方法)——“true”,表示它应该关闭,“false”,表示不需要。
默认值是“false”。
“true”值意味着Activity不会留下历史痕迹。
因为它不会在Activitystack的Task中保留,因此,用户不能返回它。
android:
taskAffinity
Activity为Task拥有的一个affinity。
拥有相同的affinity的Activity理论上属于相同的Task(在用户的角度是相同的“应用程序”)。
Task的affinity是由它的根Activity决定的。
affinity决定两件事情——Activity重新宿主的Task(参考allowTaskReparenting特性)和使用FLAG_ACTIVITY_NEW_TASK标志启动的Activity宿主的Task。
默认情况,一个应用程序中的所有Activity都拥有相同的affinity。
捏可以设定这个特性来重组它们,甚至可以把不同应用程序中定义的Activity放置到相同的Task中。
为了明确Activity不宿主特定的Task,设定该特性为空的字符串。
如果这个特性没有设置,Activity将从应用程序的设定那里继承下来(参考元素的taskAffinity特性)。
应用程序默认的affinity的名字是元素中设定的package名。
FLAG_ACTIVITY_BROUGHT_TO_FRONT
这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定。
FLAG_ACTIVITY_CLEAR_TOP
如果设置,并且这个Activity已经在当前的Task中运行,因此,不再是重新启动一个这个Activity的实例,而是在这个Activity上方的所有Activity都将关闭,然后这个Intent会作为一个新的Intent投递到老的Activity(现在位于顶端)中。
例如,假设一个Task中包含这些Activity:
A,B,C,D。
如果D调用了startActivity(),并且包含一个指向ActivityB的Intent,那么,C和D都将结束,然后B接收到这个Intent,因此,目前stack的状况是:
A,B。
上例中正在运行的ActivityB既可以在onNewIntent()中接收到这个新的Intent,也可以把自己关闭然后重新启动来接收这个Intent。
如果它的启动模式声明为“multiple”(默认值),并且你没有在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,那么它将关闭然后重新创建;对于其它的启动模式,或者在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,都将把这个Intent投递到当前这个实例的onNewIntent()中。
这个启动模式还可以与FLAG_ACTIVITY_NEW_TASK结合起来使用:
用于启动一个Task中的