Task和Activity相关

Task和Activity相关

这段时间在作一个项目,发现对Task和Activity掌握的仍是不牢固。把相关知识整理在这里,方便查阅,有几个Flag没看明白啥意思,也没测试出来效果如何。。。html

 

http://www.cnblogs.com/xirihanlin/archive/2010/06/03/1750811.html

 android:allowTaskReparenting
    用来标记Activity可否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)——“true”,表示能移动,“false”,表示它必须呆在启动时呆在的那个Task里。
    若是这个特性没有被设定,设定到<application>元素上的allowTaskReparenting特性的值会应用到Activity上。默认值为“false”。
    通常来讲,当Activity启动后,它就与启动它的Task关联,而且在那里耗尽它的整个生命周期。当当前的Task再也不显示时,你可使用这个特性来 强制Activity移动到有着affinity的Task中。典型用法是:把一个应用程序的Activity移到另外一个应用程序的主Task中。
    例如,若是e-mail中包含一个web页的连接,点击它就会启动一个Activity来显示这个页面。这个Activity是由Browser应用程序 定义的,可是,如今它做为e-mail Task的一部分。若是它从新宿主到Browser Task里,当Browser下一次进入到前台时,它就能被看见,而且,当e-mail Task再次进入前台时,就看不到它了。
    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,但不老是。
    假设,某人从主画面启动了Activity P,并从那里迁移至Activity Q。接下来用户按下HOME,而后返回Activity P。通常,用户可能见到的是Activity Q,由于它是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对象中的Activity Flags(FLAG_ACTIVITY_*变量)共同做用,来决定Activity如何启动来处理Intent。它们是:

    "standard"
    "singleTop"
    "singleTask"
    "singleInstance"

    默认模式是“standard”。
    
    这些模式能够分红两大组别,“standard”和“singleTop”一组,“singleTask”和“singleInstance”一组。具备 “standard”和“singleTop”启动模式的Activity能够实例化不少次。这些实例能够属于任何Task而且能够位于Activity stack的任何位置。典型的状况是,它们会进入调用startActivity()的Task(除非Intent对象包含 FLAG_ACTIVITY_NEW_TASK标志,在这种状况下会选择一个不一样的Task——参考taskAffinity特性)。
    相反的,“singleTask”和“singleInstance”只能启动一个Task。它们老是位于Activity stack的底部。甚至,设备一次只能拥有一个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的部分。它位于Activity stack的底部,其它Activity(必须是“standard”和“singleTop”Activity)能够启动加入到相同的Task中。 “singleInstance”Activity,换句话说,不容许其它Activity成为它的Task的部分。它是Task中的惟一 Activity。若是它启动其它的Activity,这个Activity会被放置到另外一个task中——好像Intent中包含了 FLAG_ACTIVITY_NEW_TASK标志。

android:noHistory
    用于标记当用户从Activity上离开而且它在屏幕上再也不可见时Activity是否从Activity stack中清除并结束(调用finish()方法)——“true”,表示它应该关闭,“false”,表示不须要。默认值是“false”。
    “true”值意味着Activity不会留下历史痕迹。由于它不会在Activity stack的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将从应用程序的设定那里继承下来(参考<application>元素的taskAffinity特 性)。应用程序默认的affinity的名字是<manifest>元素中设定的package名。
android

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(),而且包含一个指向Activity B的Intent,那么,C和D都将结束,而后B接收到这个Intent,所以,目前stack的情况是:A,B。
    上例中正在运行的Activity B既能够在onNewIntent()中接收到这个新的Intent,也能够把本身关闭而后从新启动来接收这个Intent。若是它的启动模式声明为 “multiple”(默认值),而且你没有在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,那么它将关闭而后从新创 建;对于其它的启动模式,或者在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,都将把这个Intent投递到当前这个实 例的onNewIntent()中。
    这个启动模式还能够与FLAG_ACTIVITY_NEW_TASK结合起来使用:用于启动一个Task中的根Activity,它会把那个Task中任 何运行的实例带入前台,而后清除它直到根Activity。这很是有用,例如,当从Notification Manager处启动一个Activity。

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
    若是设置,这将在Task的Activity stack中设置一个还原点,当Task恢复时,须要清理Activity。也就是说,下一次Task带着 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记进入前台时(典型的操做是用户在主画面重启它),这个Activity和它之 上的都将关闭,以致于用户不能再返回到它们,可是能够回到以前的Activity。
    这在你的程序有分割点的时候颇有用。例如,一个e-mail应用程序可能有一个操做是查看一个附件,须要启动图片浏览Activity来显示。这个 Activity应该做为e-mail应用程序Task的一部分,由于这是用户在这个Task中触发的操做。然而,当用户离开这个Task,而后从主画面 选择e-mail app,咱们可能但愿回到查看的会话中,但不是查看图片附件,由于这让人困惑。经过在启动图片浏览时设定这个标志,浏览及其它启动的Activity在下 次用户返回到mail程序时都将所有清除。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    若是设置,新的Activity不会在最近启动的Activity的列表中保存。

FLAG_ACTIVITY_FORWARD_RESULT
    若是设置,而且这个Intent用于从一个存在的Activity启动一个新的Activity,那么,这个做为答复目标的Activity将会传到这个 新的Activity中。这种方式下,新的Activity能够调用setResult(int),而且这个结果值将发送给那个做为答复目标的 Activity。

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
    这个标志通常不禁应用程序代码设置,若是这个Activity是从历史记录里启动的(常按HOME键),那么,系统会帮你设定。

FLAG_ACTIVITY_MULTIPLE_TASK
    不要使用这个标志,除非你本身实现了应用程序启动器。与FLAG_ACTIVITY_NEW_TASK结合起来使用,能够禁用把已存的Task送入前台的 行为。当设置时,新的Task老是会启动来处理Intent,而无论这是是否已经有一个Task能够处理相同的事情。
    因为默认的系统不包含图形Task管理功能,所以,你不该该使用这个标志,除非你提供给用户一种方式能够返回到已经启动的Task。
    若是FLAG_ACTIVITY_NEW_TASK标志没有设置,这个标志被忽略。

FLAG_ACTIVITY_NEW_TASK
    若是设置,这个Activity会成为历史stack中一个新Task的开始。一个Task(从启动它的Activity到下一个Task中的 Activity)定义了用户能够迁移的Activity原子组。Task能够移动到前台和后台;在某个特定Task中的全部Activity老是保持相 同的次序。
    这个标志通常用于呈现“启动”类型的行为:它们提供用户一系列能够单独完成的事情,与启动它们的Activity彻底无关。
    使用这个标志,若是正在启动的Activity的Task已经在运行的话,那么,新的Activity将不会启动;代替的,当前Task会简单的移入前台。参考FLAG_ACTIVITY_MULTIPLE_TASK标志,能够禁用这一行为。
    这个标志不能用于调用方对已经启动的Activity请求结果。

FLAG_ACTIVITY_NO_ANIMATION
    若是在Intent中设置,并传递给Context.startActivity()的话,这个标志将阻止系统进入下一个Activity时应用 Acitivity迁移动画。这并不意味着动画将永不运行——若是另外一个Activity在启动显示以前,没有指定这个标志,那么,动画将被应用。这个标 志能够很好的用于执行一连串的操做,而动画被看做是更高一级的事件的驱动。

FLAG_ACTIVITY_NO_HISTORY
    若是设置,新的Activity将再也不历史stack中保留。用户一离开它,这个Activity就关闭了。这也能够经过设置noHistory特性。

FLAG_ACTIVITY_NO_USER_ACTION
    若是设置,做为新启动的Activity进入前台时,这个标志将在Activity暂停以前阻止从最前方的Activity回调的onUserLeaveHint()。
    典型的,一个Activity能够依赖这个回调指明显式的用户动做引发的Activity移出后台。这个回调在Activity的生命周期中标记一个合适的点,并关闭一些Notification。
    若是一个Activity经过非用户驱动的事件,如来电或闹钟,启动的,这个标志也应该传递给Context.startActivity,保证暂停的Activity不认为用户已经知晓其Notification。

FLAG_ACTIVITY_PREVIOUS_IS_TOP
    If set and this intent is being used to launch a new activity from an existing one, the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one. The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately.

FLAG_ACTIVITY_REORDER_TO_FRONT
    若是在Intent中设置,并传递给Context.startActivity(),这个标志将引起已经运行的Activity移动到历史stack的顶端。
    例如,假设一个Task由四个Activity组成:A,B,C,D。若是D调用startActivity()来启动Activity B,那么,B会移动到历史stack的顶端,如今的次序变成A,C,D,B。若是FLAG_ACTIVITY_CLEAR_TOP标志也设置的话,那么这 个标志将被忽略。

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

If set, and this activity is either being started in a new task or bringing to the top an existing task, then it will be launched as the front door of the task. This will result in the application of any affinities needed to have that task in the proper state (either moving activities to or from it), or simply resetting that task to its initial state if needed.

FLAG_ACTIVITY_SINGLE_TOP
    若是设置,当这个Activity位于历史stack的顶端运行时,再也不启动一个新的。 web

 

 

ActivityTaskapp

 

以前提到的,一个Activity能够启动另外一个,即使是定义在不一样应用程序中的Activity。例如,假设你想让用户显示一些地方的街景。而这里已经有一个Activity能够作到这一点,所以,你的Activity所须要作的只是在Intent对象中添加必要的信息,并传递给startActivity()。地图浏览将会显示你的地图。当用户按下BACK键,你的Activity会再次出如今屏幕上。post

 

对于用户来讲,看起来好像是地图浏览与你的Activity同样,属于相同的应用程序,即使是它定义在其它的应用程序里,并运行在那个应用程序的进程里。Android经过将这两个Activity保存在同一个Task里来体现这一用户体验。简单来讲,一个Task就是用户体验上的一个“应用”。它将相关的Activity组合在一块儿,以stack的方式管理。stack中根Activity启动Task——典型的,它就是用户在应用程序启动栏中选择的Activity。位于stack顶端的Activity是当前正在运行的——可以聚焦用户的动做。当一个Activity启动另外一个,新的Activity进入stack;它成为正在运行的Activity。以前的Activity仍保留在stack中。当用户按下BACK键,当前的Activitystack中退出,以前的那个成为正在运行的Activity测试

 

stack包含对象,所以,若是一个Task中有多个同一个Activity的实例时——多个地图浏览,例如——stack为每一个实例拥有一个独立的入口。位于stack中的Activity不会从新调整,只是进入和退出。动画

 

一个Task就是一组Activity,不是一个类或者在manifest中定义的一个元素。所以,没有办法为Task设置独立于它的Activity的属性值。Task的值做为总体在根Activity中设置。例如,下一个章节会讨论Task的“affinity”;那个值就是从Task中的根Activity中读取的。this

 

Task中的全部Activity做为一个单元一块儿移动。整个Task(整个Activity stack)能够进入前台或者退到后台。例如,假设当前Task中的stack中有4Activity——3个位于当前Activity下方。用户按下HOME键,进入到应用程序启动栏,而后选择一个新的应用程序(实际上,一个新的Task)。当前Task退到后台,而且新Task中的根Activity会显示出来。而后,通过一段时间后,用户回到Home画面,而后再次选择前一个应用程序(前一个Task)。那个拥有4ActivityTask会进入前台。当用户按下BACK键,屏幕不会显示用户刚刚离开的Activity(前一个Task的根Activity)。而是,这个stack中的顶端Activity移除,相同Task中的前一个Activity会显示出来。spa

 

刚才描述的行为是ActivityTask的默认行为。但有方法来彻底改变它。Task之间的关联,和一个Task中的一个Activity行为,受启动ActivityIntent对象中设置的Flagmanifest文件中Activity<activity>元素的特性值交互控制。调用者和响应者都有权决定如何发生。htm

 

核心的Intent Flag有:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_SINGLE_TOP

 

核心的<activity>特性有:

taskAffinity

launchMode

allowTaskReparenting

clearTaskOnLaunch

alwaysRetainTaskState

finishOnTaskLaunch

 

接下来的章节将描述一些Flag和特性的用法,如何相互影响,以及在使用时的建议。

 

Affinity和新Task

默认状况下,一个应用程序中的全部Activity都有affinity——也就是说,属于同一个Task中全部Activity有一个设定。然而,每一个Activity均可以在<activity>元素的taskAffinity特性上设置单独的值。定义在不一样应用程序中的Activity能够共享同一个affinity,或者定义在同一个应用程序中的Activity设置不一样的affinityAffinity在两种环境下工做:Intent对象包含FLAG_ACTIVITY_NEW_TASK标志,和ActivityallowTaskReparenting特性设置为“true”。

FLAG_ACTIVITY_NEW_TASK:

以前描述的,一个Activity通常经过调用startActivity()启动并加入到Task中。它同调用者同样,进入同一个Task。然而,若是传递给startActivity()Intent对象中包含FLAG_ACTIVITY_NEW_TASK时,系统会搜索一个新的Task来容纳新的Activity。一般,如标志的名字所示,是一个新的Task。然而,并非必须是。若是已经存在一个Task与新Activityaffinity相同,这个Activity就会加入到那个Task中。若是不是,启动一个新的Task

allowTaskReparenting

若是一个ActivityallowTaskReparenting特性设置为“true”,它就能从启动的Task中移到有着相同affinityTask(这个Task进入到前台的时候)。例如,在一个旅游的程序中定义了一个能够报告选择城市的天气状况的Activity。它和同一个应用程序的其它Activity同样,有着相同的Affinity(默认的Affinity),而且它容许从新宿主。你的Activity中的一个启动了天气预报,所以,它初始化到和你Activity相同的Task中。然而,当旅游应用程序下一次进入到前台时,天气预报那个Activity将会从新编排并在那个Task中显示。

 

若是从用户的角度出发,一个.apk文件包含多个“应用”的话,你可能但愿为关联的Activity设置不一样的affinity

 

Launch Mode

 

这里4种不一样的启动模式能够设置到<activity>元素的launchMode特性上:

standard(默认模式)

singleTop

singleTask

singleInstance

 

这些模式有如下四点区别:

哪一个Task将容纳响应IntentActivity。对于“standard”和“singleTop”来讲,是产生Intent的那个Task(并调用startActivity())——除非Intent对象包含FLAG_ACTIVITY_NEW_TASK。在那种状况下,不一样的Task将被选择,如“Affinity和新Task”中描述的那样。对比而言,“singleTask”和“singleInstance”指示Activity老是一个Task的根。它们定义一个Task;它们不会加入到另外一个Task中。

是否有多个Activity的实例。“standard”和“singleTop”能够实例化屡次。它们能够属于多个Task,一个特定的Task能够有相同Activity的多个实例。对比而言,“singleTask”和“singleInstance”只能有一个实例。由于这些Activity只能位于Task的底部,这一限制意味着在设备的某个时间,不会出现这样Task的多个实例。

是否能够在同一个Task中拥有其它的Activity。“singleInstanceActivity保持单身,在它的Task中它是仅有的Activity。若是它启动另外一个Activity,那个Activity将会放入到不一样的Task中,而无论它的启动模式——好像FLAG_ACTIVITY_NEW_TASKIntent中同样。对于其它方面,,“singleInstance”等同于“singleTask”。其它三个模式容许多个Activity加入到这个Task中。“singleTaskActivity老是位于Task的底部,但它能够启动其它的Activity并放入到它的Task中。“standard”和“singleTop”的Activity能够出如今stack的任何地方。

是否一个新的实例启动来处理新的Intent。对于默认的“standard”来讲,都是建立一个新的实例来响应新的Intent。每一个实例处理一个Intent。对于“singleTop”来讲,若是它位于目标Task的顶端,那么,已经存在的实例就能够重复使用来处理这个新的Intent。若是它不在顶端,那么它就不能重复使用。替代的,新的实例将建立来响应新的Intent,并进入到stack中。

例如,假设一TaskActivity stack中包含根Activity A和其它Activity BCD,而且D位于顶端,所以,stackA-B-C-D。有一个Intent来了,它要启动D类型的Activity。若是D有默认的“standard”启动模式,那么,一个新的实例将被启动而且stack变成A-B-C-D-D。然而,若是D的启动模式“singleTop”,已经存在的实例将去处理新来的Intent(由于它正好处在stack的顶端),而且stack依旧是A-B-C-D

换句话说,若是来临的Intent是冲着B类型的,那么,B类型的实例将被建立启动而无论B的模式是“standard”或“singleTop”(由于B不处在stack的顶端),所以,stack将会是A-B-C-D-B

以前提到的,设备上不会出现超过一个实例的“singleTask”或“singleInstanceActivity,所以,那个实例都将去处理全部新来的Intent。“singleInstanceActivity老是位于stack的顶端(由于它是task中惟一的Activity),所以,它老是处于能处理Intent的位置。然而,“singleTaskActivity可能有或没有其它Activity处于它的上方。若是有,它就不处于能处理Intent的位置,那么,这个Intent将被丢弃。(即便Intent被丢弃了,它的到来会引起那个Task进入到前台,在那里,它会继续保留。)

 

当一个存在的Activity请求去处理一个新的Intent时,Intent对象将传到该ActivityonNewIntent()的方法中。(原来启动ActivityIntent对象能够经过调用getIntent()获得。)

 

注意:当一个新的实例建立来处理新的Intent时,用户能够按下BACK键返回到以前的状态(前一个Activity)。但一个存在的实例来处理新的Intent时,用户不能按下BACK键返回到新Intent到来以前的状态。

 

清除stack

若是用户离开Task很长一段时间,系统会清除Task中的全部Activity,除根Activity外。当用户再次返回到这个Task时,和用户离开时同样,仅仅只是初始化Activity呈现。这样作的意图是,通过一些时间后,用户可能已经忘记以前正在作的事情,而且打算回到Task开始些新的时期。

 

这是默认状况。这里有一些Activity特性能够用于控制这一行为而且修改它:

alwaysRetainTaskState

若是Task的根Activity的这个特性设置为“true”时,上面描述的默认行为不会发生。Task保留全部的Activity,即使是通过很长一段时间。

clearTaskOnLaunch

若是Task的根Activity的这个特性设置为“true”时,当用户离开Task并返回时,stack会清除直到根Activity。换句话说,它是alwaysRetainTaskState的另外一个极端。用户老是回到Task的初始化状态,即使是一个短暂的离开。

finishOnTaskLaunch

这个特性和clearTaskOnLaunch类似,但它针对单个Activity,不是整个Task。它能使任何Activity消失,包括根Activity。当它设置为“true”时,这个Activity仅在当前会话期间保持为Task的部分。若是用户离开并再次返回到这个Task,它就再也不显示了。

 

这里还有其它的方式能够强制Activitystack中移除。若是Intent对象中包含FLAG_ACTIVITY_CLEAR_TOP标志,而且目标Task中已经有一个这个类型Activity的实例,并且这个实例应该处理这个Intent,那么,位于其上的Activity都将移除,这样,这个Activity就能在stack的顶端并响应这个Intent。若是这个Activity的启动模式设定为“standard”,它也会从stack中清除,而后新的实例启动来响应这个Intent。这是由于当启动模式设定为“standard“时,老是会建立一个新的实例来响应新的Intent

 

FLAG_ACTIVITY_CLEAR_TOP常常与FLAG_ACTIVITY_NEW_TASK结合起来使用。当一块儿使用时,这些标志能够定位其它Task中已经存在的Activity,而且把它置于能够响应Intent的位置。

 

启动Task

若是一个ActivityIntent Filteraction为“android.intent.action.MAIN”、category为“android.intent.category.LAUNCHER”时,它就能够做为一个Task的入口点。有这种类型的Filter会在致使这个Activity在应用程序启动栏显示一个图标和标签,给用户提供一个方式能够启动这个Task和在任什么时候候能够再次回到这个Task

 

第二个能力很重要:用户必定能够离开一个Task,而后能够再次回到它。基于这个缘由,两个启动模式,“singleTask”和“singleInstance”应该只在有MAINLAUNCHERActivity上使用。例如,假设这个Filter没有的话:一个Intent启动了一个“singleTaskActivity,初始化一个新的Task,而后用户花费了一些时间在它上面。而后,用户按下HOME键。如今,这个Task处于后台而且被HOME画面遮盖。因为它不能在应用程序启动栏显示,用户就没有办法能够返回它。

 

在面对FLAG_ACTIVITY_NEW_TASK时,也有类似的困难。若是这个标志致使一个Activity启动了一个新的Task,而且用户按下HOME键离开它,这里必须有方法能够再次回到它。一些机能(如Notification Manager)老是在外部的Task中启动Activity,而不是做为本身的一部分,所以,它老是把FLAG_ACTIVITY_NEW_TASK标志放入Intent,而后传递给startActivity()。若是你的Activity可能会被外部的机能(可能使用这个标志)调用,注意用户能够额外的方式能够返回到启动的Task

 

若是你不想用户回到某个Activity ,能够把<activity> 元素的finishOnTaskLaunch 设置为“true ”。
相关文章
相关标签/搜索