• Android中Activity与Task相关的属性解析



    与Task相关的属性解析

    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名。

    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的顶端执行时,不再启动一个新的。


    Activity和Task

    之前提到的,一个Activity能够启动还有一个,即便是定义在不同应用程序中的Activity。

    比如,假设你想让用户显示一些地方的街景。而这里已经有一个Activity能够做到这一点,因此,你的Activity所须要做的仅仅是在Intent对象中增加必要的信息,并传递给startActivity()。地图浏览将会显示你的地图。当用户按下BACK键,你的Activity会再次出如今屏幕上。


    对于用户来说,看起来好像是地图浏览与你的Activity一样,属于同样的应用程序,即便是它定义在其他的应用程序里,并执行在那个应用程序的进程里。Android通过将这两个Activity保存在同一个Task里来体现这一用户体验。

    简单来说。一个Task就是用户体验上的一个“应用”。它将相关的Activity组合在一起。以stack的方式管理。stack中根Activity启动Task——典型的,它就是用户在应用程序启动栏中选择的Activity。位于stack顶端的Activity是当前正在执行的——能够聚焦用户的动作。

    当一个Activity启动还有一个,新的Activity进入stack;它成为正在执行的Activity。

    之前的Activity仍保留在stack中。当用户按下BACK键。当前的Activity从stack中退出,之前的那个成为正在执行的Activity。

    stack包括对象。因此,假设一个Task中有多个同一个Activity的实例时——多个地图浏览。比如——stack为每一个实例拥有一个独立的入口。位于stack中的Activity不会又一次调整,仅仅是进入和退出。


    一个Task就是一组Activity。不是一个类或者在manifest中定义的一个元素。

    因此,没有办法为Task设置独立于它的Activity的属性值。

    Task的值作为总体在根Activity中设置。比如。下一个章节会讨论Task的“affinity”;那个值就是从Task中的根Activity中读取的。

    Task中的全部Activity作为一个单元一起移动。

    整个Task(整个Activity stack)能够进入前台或者退到后台。比如。假设当前Task中的stack中有4个Activity——3个位于当前Activity下方。用户按下HOME键。进入到应用程序启动栏,然后选择一个新的应用程序(实际上,一个新的Task)。当前Task退到后台,而且新Task中的根Activity会显示出来。

    然后,经过一段时间后,用户回到Home画面。然后再次选择前一个应用程序(前一个Task)。那个拥有4个Activity的Task会进入前台。当用户按下BACK键,屏幕不会显示用户刚刚离开的Activity(前一个Task的根Activity)。而是,这个stack中的顶端Activity移除,同样Task中的前一个Activity会显示出来。


    刚才描写叙述的行为是Activity和Task的默认行为。但有方法来全然改变它。

    Task之间的关联,和一个Task中的一个Activity行为。受启动Activity的Intent对象中设置的Flag和manifest文件里Activity的<activity>元素的特性值交互控制。调用者和响应者都有权决定怎样发生。


    核心的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设置不同的affinity。

    Affinity在两种环境下工作:Intent对象包括FLAG_ACTIVITY_NEW_TASK标志,和Activity的allowTaskReparenting特性设置为“true”。


    FLAG_ACTIVITY_NEW_TASK:

    之前描写叙述的,一个Activity一般通过调用startActivity()启动并增加到Task中。它同调用者一样,进入同一个Task。

    然而。假设传递给startActivity()的Intent对象中包括FLAG_ACTIVITY_NEW_TASK时,系统会搜索一个新的Task来容纳新的Activity。通常,如标志的名字所看到的,是一个新的Task。然而。并非必须是。假设已经存在一个Task与新Activity的affinity同样,这个Activity就会增加到那个Task中。假设不是,启动一个新的Task。


    allowTaskReparenting:

    假设一个Activity的allowTaskReparenting特性设置为“true”,它就能从启动的Task中移到有着同样affinity的Task(这个Task进入到前台的时候)。比如,在一个旅游的程序中定义了一个能够报告选择城市的天气情况的Activity。它和同一个应用程序的其他Activity一样,有着同样的Affinity(默认的Affinity),而且它同意又一次宿主。

    你的Activity中的一个启动了天气预报。因此。它初始化到和你Activity同样的Task中。然而。当旅游应用程序下一次进入到前台时,天气预报那个Activity将会又一次编排并在那个Task中显示。

    假设从用户的角度出发,一个.apk文件包括多个“应用”的话,你可能希望为关联的Activity设置不同的affinity。

  • 相关阅读:
    ruby 正则表达式 匹配中文
    ruby 正则表达式 匹配所有符合规则的信息
    MobileNetV2: Inverted Residuals and Linear Bottlenecks
    MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
    SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size
    LeetCode 409——最长回文串
    LeetCode 516——最长回文子序列
    LeetCode 5——最长回文子串
    LeetCode 300——最长上升子序列
    动态规划之——最长公共子串和矩阵链乘法
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7392256.html
Copyright © 2020-2023  润新知