`
sharp2wing
  • 浏览: 271843 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Android的Task和Activity(一)

阅读更多
Android的Task和Activity(一)

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-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将从应用程序的设定那里继承下来(参考元素的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(),并且包含一个指向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在启动显示之前,没有指定这个标志,那么,动画将被应用。这个标志可以很好的用于执行一连串的操作,而动画被看作是更高一级的事件的驱动。
分享到:
评论

相关推荐

    android activity和task

    在Android操作系统中,Activity和Task是两个非常关键的概念,它们共同构成了应用的用户界面和任务管理机制。Activity可以理解为用户可以看到和交互的屏幕,而Task则是一个操作的堆栈,用于管理一系列相关的Activity...

    Android Task 进程与线程详解

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

    Android 一次启动多个Activity (TaskStackBuilder)

    "Android一次启动多个Activity (TaskStackBuilder)"这个话题涉及到Android的Task和Back Stack管理,以及如何利用TaskStackBuilder实现从通知启动多级Activity并保持正确的返回流程。下面将详细阐述这一知识点。 ...

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

    在Android开发中,有时我们需要创建一个弹出式对话框来与用户进行交互,但不同于常见的`Dialog`类,我们可以利用`Activity`来实现这一功能。这种方式适用于需要更复杂交互或者自定义布局的情况。本文将详细讲解如何...

    Android 点击桌面快捷方式和Notifycation之后跳转到Task栈顶Activity

    1.点击桌面快捷方式进入到Task顶Activity 2.点击Notifycation进入到Task顶Activity 3.详情:http://blog.csdn.net/xiaanming/article/details/9312857

    Android Activity学习笔记

    Android Activity是Android系统中最基本的组件之一,它负责处理用户交互和显示用户界面。本文将深入讲解Activity的生命周期、Activity之间的数据交互、Activity启动模式、Task和BackStack等知识点。 Activity生命...

    android两个Activity的转换

    7. **Intent Flag**:启动Activity时可以设置Intent的Flag,例如FLAG_ACTIVITY_NEW_TASK表示启动一个新的任务,FLAG_ACTIVITY_CLEAR_TOP则会清除目标Activity之上所有未完成的Activity。 8. **Transition动画**:...

    Android Task Manager Download

    Android Task Manager是一款用于管理Android设备上运行任务和进程的应用工具,它允许用户查看并控制手机上的应用程序及其后台进程。在深入探讨这个话题之前,我们先了解一下Task Manager的基本概念。 在Android系统...

    Android深入理解Activity!

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

    Android基础系列的Activity

    Android采用任务(Task)和回退栈(Back Stack)来管理Activity。默认情况下,新启动的Activity会被压入栈顶,而当用户点击后退键时,栈顶的Activity会被弹出,显示前一个Activity,这就实现了回退功能。 对于多窗口...

    android退出所有Activity并且不弹出对话框实现

    在Android中,每个应用程序都有一个任务(Task)栈,Activity按照启动顺序被压入栈中,最后启动的Activity位于栈顶。当用户按下Back键时,系统会从栈顶取出并销毁当前Activity,依次回退到前一个Activity。而要退出...

    Android task和back stack

    一个activity也可以打开同一设备上存在于其它应用的activitie,例如,如果你的应用想要发送一个邮件,你可以定义一个intent来执行一个"send"动作并包含一些数据,比如一个地址和一条信息.另一个应用中的一个叫嚣自己...

    035_android_Activity入门和跳转

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

    Android中Activity启动模式demo

    在“ActivityLaunchModeDemo”项目中,开发者可以体验到每种启动模式的实际效果,通过查看和分析task ID和Activity实例,了解不同模式下Activity如何被创建和管理。通过实践,开发者可以更好地理解和掌握如何根据...

    android入门activity跳转源代码

    在Android开发中,Activity是应用程序的基本构建块,用于展示用户界面和处理用户交互。Activity跳转是Android应用中常见的操作,用于在不同的界面之间切换。本篇将详细讲解`android入门activity跳转源代码`的相关...

    全面解析Android应用开发中Activity类的用法

    Android使用任务(Task)和回退栈(Back Stack)管理Activity。新启动的Activity会被压入栈顶,而`finish()`方法会将当前Activity从栈中移除,导致前一个Activity恢复显示。 6. **Activity的四种启动模式**: - `...

    Android 改变Activity切换方式

    在Android开发中,Activity是应用程序的基本构建块,用于呈现用户界面和处理用户交互。默认情况下,Android系统在用户导航时采用栈(后进先出,LIFO)的方式管理Activity,即新的Activity压入栈顶,当用户按下Back键...

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

    为了管理Activity的生命周期和用户界面的流程,Android系统提供了一系列的机制和属性,其中包括四种不同的Activity启动模式以及taskAffinity属性。这些启动模式和属性共同作用于Activity所属的任务栈(Task)和后退...

    Android Task Manager 实做

    在Android中,任务(Task)是一系列按栈结构组织的Activity,它们共享同一个上下文环境,可以互相切换。进程(Process)则是运行应用程序的容器,多个Activity可能存在于同一个进程中。Android系统会根据内存需求和...

    安卓Android源码——Activity设置相同的action进行判断源码.zip

    当我们创建多个Activity并希望它们响应相同的Intent Action时,需要理解Android如何处理这些Intent以及如何在源码层面进行判断和选择合适的Activity。在这个“安卓Android源码——Activity设置相同的action进行判断...

Global site tag (gtag.js) - Google Analytics