`

Task和Activity相关的一些属性

阅读更多
http://hubingforever.blog.163.com/blog/static/171040579201011944826864/

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中保留,因此,用户不能返回它。
注意1:该Activity会在用户离开时,或在任务管理器再次选择它时销毁。
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名。
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。如果它的启动模式声明为 “standard”(默认值),
    并且你没有在这个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。
    这种方式下,新的Activity可以调用setResult(int)或setResult (int resultCode, Intent data),并且这个结果值将发送给那个作为答复目标的Activity。
注意:感觉它和startActivityForResult的功能差不多,但是还是有疑惑。
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一般通过调用startActivity()启动并加入到Task中。它同调用者一样,进入同一个Task。
   然而,如果传递给startActivity()的Intent对象中包含FLAG_ACTIVITY_NEW_TASK时,系统会搜索一个新的Task来容纳新的Activity。
   通常,如标志的名字所示,是一个新的Task。然而,并不是必须是。如果已经存在一个Task与新Activity的affinity相同,这个Activity就会加入到那个Task中。如果不是,启动一个新的Task。
  如果启动它的acitve和新Activity的affinity相同,那么新Activity的会进入启动它的acitve所在的Task.
FLAG_ACTIVITY_NO_ANIMATION
    如果在Intent中设置,并传递给Context.startActivity()的话,这个标志将阻止系统进入下一个Activity时应用 Acitivity迁移动画。
    这并不意味着动画将永不运行——如果另一个Activity在启动显示之前,没有指定这个标志,那么,动画将被应用。
    这个标志可以很好的用于执行一连串的操作,而动画被看作是更高一级的事件的驱动。
FLAG_ACTIVITY_NO_HISTORY
    如果设置,新的Activity将不再历史stack中保留。用户一离开它,这个Activity就关闭了。这也可以通过设置noHistory特性。
注意1:该Activity会在用户离开时,有时要直到离开后再回来时才销毁。但是对于noHistory特性,在任务管理器再次选择它时也会被销毁。
FLAG_ACTIVITY_NO_USER_ACTION
    如果设置,作为新启动的Activity进入前台时,这个标志将阻止现在在最前方的Activity因为我们新的Activity要启动而暂停时回调onUserLeaveHint()。
    一个Activity可以依赖这个回调(onUserLeaveHint())指明是显式的用户动作引起的Activity移出后台。
    这个回调在Activity的生命周期中标记一个合适的点,并关闭一些Notification。
    如果一个Activity是通过非用户驱动的事件启动,如来电或闹钟,启动的,这个标志也应该传递给Context.startActivity,
    这样保证暂停的Activity不认为用户已经知晓其Notification。
注意1:如果一个Activity通过非用户驱动的事件,如来电或闹钟,启动的,这个标志也应该传递给Context.startActivity。
注意2:关于onUserLeaveHint的内容请参照附1.
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.
注意1:不太明白
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标志也设置的话,那么这个标志将被忽略。
注意1:不太明白
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.
注意1:不太明白
FLAG_ACTIVITY_SINGLE_TOP
    如果设置,当这个Activity位于历史stack的顶端运行时,不再启动一个新的。
附1:
protected void onUserLeaveHint ()
Since: API Level 3
Called as part of the activity lifecycle when an activity is about to go into the background as the result of user choice.
For example, when the user presses the Home key, onUserLeaveHint() will be called, but when an incoming phone call causes the in-call Activity to be automatically brought to the foreground,
onUserLeaveHint() will not be called on the activity being interrupted.
In cases when it is invoked, this method is called right before the activity's onPause() callback.
This callback and onUserInteraction() are intended to help activities manage status bar notifications intelligently;
specifically, for helping activities determine the proper time to cancel a notfication.
作为activity周期的一部分,它在activity因为用户要跳转到别的activity而要退到background时使用。
比如,在用户按下Home键(用户的choice),它将被调用。比如有电话进来(不属于用户的choice),它就不会被调用。
那么系统如何区分让当前activity退到background时使用是用户的choice?
它是根据促使当前activity退到background的那个新启动的Activity的Intent里是否有FLAG_ACTIVITY_NO_USER_ACTION来确定的。
注意:通过调用finish()使该activity销毁时不会调用该函数。

Android下affinities 和任务(task)
http://blog.163.com/zmhot88@126/blog/static/169846647201081732852370/?fromdm&fromSearch&isFromSearchEngine=yes
分享到:
评论

相关推荐

    android activity和task

    Activity可以理解为用户可以看到和交互的屏幕,而Task则是一个操作的堆栈,用于管理一系列相关的Activity。在Task中,Activity按照后进先出(LIFO)的原则进行操作,即最近打开的Activity位于栈顶,最先打开的...

    androidactivity标签的一些属性借鉴.pdf

    此属性控制Activity是否可以在启动时的Task和具有相同affinity的Task之间移动。默认值为`false`,意味着Activity一旦启动,就会与其启动的Task绑定,直到Task结束。如果设置为`true`,当有相同affinity的Task进入...

    Android中Activity四种启动模式和taskAffinity属性详解-Rong

    这些启动模式和属性共同作用于Activity所属的任务栈(Task)和后退栈(Back Stack),进而影响应用的运行流程和用户的操作体验。 首先,让我们来了解一下Android中的Application、Task和Process的区别与联系。...

    activity控件基础task.rar

    Activity控件基础Task的压缩包文件提供了关于如何在Android应用程序中使用和管理Activity的示例代码和资源。在这个压缩包中,我们可以看到开发者在学习Android时创建的一些基本布局和控件的演示,比如相对布局...

    ActivityManagerService相关流程分析

    标题“ActivityManagerService相关流程分析”指明了本文档探讨的重点是Android系统中用于管理Activity生命周期、任务栈(TaskStack)和进程管理的关键组件ActivityManagerService(AMS)。AMS是Android系统中一个...

    Android activity属性设置大全.doc

    以下是对Android activity属性的详细解释: 1. android:allowTaskReparenting=["true" | "false"] 这个属性决定是否允许activity在不同的任务(task)之间移动。如果设置为"true",activity可以在用户导航时改变其...

    Android Task 进程与线程详解

    在 Android 中,每一个 Activity 的 Task 模式,都是可以由 Activity 提供方(通过配置文件)和 Activity 使用方(通过 Intent 中的 flag 信息)进行配置和选择。使用方对 Activity 的控制力,是限定在提供方允许的...

    Activity启动模式及Intent的Flag属性对Intent传值的影响

    本篇将深入探讨`Activity`的启动模式和`Intent`的`Flag`属性对`Intent`传值的影响。 1. **Activity启动模式**: - **Standard**(标准模式):默认模式,每次启动新的实例,无论当前栈中是否存在该Activity。 - *...

    Android Activity的4种TaskMode

    Task和Activity的关系是Android系统组织应用运行流程的核心概念。本文将深入探讨Android Activity的4种TaskMode,以及它们如何影响应用的行为和用户体验。 1. **标准模式(Standard)** 这是最常见的Activity启动...

    Android基础系列的Activity

    本系列将深入探讨Android基础中的Activity相关知识,帮助开发者理解和掌握如何创建、管理和控制Activity。 首先,Activity的生命周期是理解Activity的关键。一个Activity会经历创建(onCreate())、启动(onStart()...

    跳转动画实现的一些方法涉及Style,task等知识点

    通过理解Task和启动模式,我们可以控制Activity的启动行为,以达到预期的堆栈管理效果;而Transition API则为开发者提供了更多高级动画效果的可能性。熟练掌握这些知识点,将使你的Android应用在用户体验上更上一层...

    Activity详细剖析之使用范例

    Activity的onResume()和onPause()方法不仅与生命周期相关,还涉及到用户焦点。当Activity部分或完全被遮挡时,即使Activity仍在运行,也会调用onPause()。 十二、Activity的启动模式 在AndroidManifest.xml中,...

    Android学习笔记-Activity篇

    这篇学习笔记将深入探讨Activity的相关知识,包括创建、声明、启动、关闭以及生命周期管理,同时还会涉及Task和Back Stack的管理。 一、Activity创建: 在Android应用中,Activity的创建通常始于一个Java类,这个类...

    Android使用Activity用作弹出式对话框

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); ``` 通过这种方式,我们可以使用`Activity`来创建弹出式对话框,提供更多的自定义和交互性。但是要...

    035_android_Activity入门和跳转

    Android系统使用任务(Task)和栈(BackStack)来管理Activity。新启动的Activity会被压入栈顶,当按下Back键时,栈顶的Activity会被弹出,呈现出栈底的Activity。理解这一机制有助于避免回退过程中的异常。 9. ...

    Android深入理解Activity!

    Android提供了一些权限设置,比如FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_SINGLE_TOP,可以控制Activity的启动行为,防止恶意启动或循环启动。 总结,深入理解Activity不仅需要掌握其基本概念,还需要熟悉各种高级...

    Boot process and Manage of the Activity

    Activity的启动、切换以及管理会受到配置和属性的影响,本文将介绍一些重要和典型的概念,包括Stack、Task、BackStack和Affinity。 在启动Activity的过程中,Launcher(启动器)起着至关重要的作用。在Launcher中,...

    Android模拟Activity进出栈.zip

    4. **模拟Activity进出栈**:开发者可能需要在测试或特定场景下模拟Activity的进出栈行为,这通常通过Intent的FLAG属性实现,如FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_CLEAR_TOP等。例如,使用FLAG_ACTIVITY_NEW_...

    Activity四种启动模式

    同时,还可以通过Intent的FLAG_ACTIVITY_*系列标志动态改变启动行为,如FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_SINGLE_TOP等。 总之,掌握Activity的启动模式对于优化应用流程、防止内存泄漏以及提升用户体验具有...

    Activity栈的简单应用.rar

    通过FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TOP等FLAG,可以控制Activity如何进入和退出栈,比如清除栈中所有Activity,或者回退到特定Activity。 5. **返回栈的概念**:当用户点击后退键或调用finish()方法...

Global site tag (gtag.js) - Google Analytics