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

Android的Task和Activity(二)

阅读更多
Android的Task和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的元素的特性值交互控制。调用者和响应者都有权决定如何发生。

  核心的Intent Flag有:

  FLAG_ACTIVITY_NEW_TASK

  FLAG_ACTIVITY_CLEAR_TOP

  FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

  FLAG_ACTIVITY_SINGLE_TOP

  核心的特性有:

  taskAffinity

  launchMode

  allowTaskReparenting

  clearTaskOnLaunch

  alwaysRetainTaskState

  finishOnTaskLaunch

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

  Affinity和新Task

  默认情况下,一个应用程序中的所有Activity都有affinity——也就是说,属于同一个Task中所有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。

  Launch Mode

  这里4种不同的启动模式可以设置到元素的launchMode特性上:

  standard(默认模式)

  singleTop

  singleTask

  singleInstance

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

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

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

  l 是否可以在同一个Task中拥有其它的Activity。“singleInstance”Activity保持单身,在它的Task中它是仅有的 Activity。如果它启动另一个Activity,那个Activity将会放入到不同的Task中,而不管它的启动模式——好像 FLAG_ACTIVITY_NEW_TASK在Intent中一样。对于其它方面,,“singleInstance”等同于 “singleTask”。其它三个模式允许多个Activity加入到这个Task中。“singleTask”Activity总是位于Task的底部,但它可以启动其它的Activity并放入到它的Task中。“standard”和“singleTop”的Activity可以出现在stack 的任何地方。

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

  例如,假设一个Task的Activity stack中包含根Activity A和其它Activity B,C,D,并且D位于顶端,因此,stack是A-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”或“singleInstance”Activity,因此,那个实例都将去处理所有新来的Intent。“singleInstance alimama_pid="mm_15626785_2176297_8615857"; alimama_titlecolor="3366CC"; alimama_descolor ="000000"; alimama_bgcolor="FFFFFF"; alimama_bordercolor="CCCCCC"; alimama_linkcolor="008000"; alimama_bottomcolor="FFFFFF"; alimama_anglesize="0"; alimama_bgpic="0"; alimama_icon="0"; alimama_sizecode="9999"; alimama_width=468; alimama_height=90; alimama_type=2;
分享到:
评论

相关推荐

    android activity和task

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

    Android Task 进程与线程详解

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

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

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); ``` 通过这种方式,我们可以使用`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是Android系统中最基本的组件之一,它负责处理用户交互和显示用户界面。...Activity的生命周期、数据交互、启动模式和Task和BackStack都是Android开发中非常重要的知识点。

    Android深入理解Activity!

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

    Android 一次启动多个Activity (TaskStackBuilder)

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

    Android Task Manager Download

    通常,源码分析会涉及Android的ActivityManagerService、Process和Activity等核心组件,以及Intent和BroadcastReceiver等通信机制。 对于开发者来说,掌握Task Manager的使用和实现,有助于优化自己的应用,避免因...

    android两个Activity的转换

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

    Android基础系列的Activity

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

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

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

    android入门activity跳转源代码

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

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

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

    035_android_Activity入门和跳转

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

    android之appwidget(二)启动新activity

    这里,`TargetActivity`是我们要启动的Activity,`FLAG_ACTIVITY_NEW_TASK`标志确保Activity在一个新的任务栈中启动。 2. **将PendingIntent设置到RemoteViews**: 创建了PendingIntent后,我们需要将其关联到App...

    Android 改变Activity切换方式

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

    Android中Activity启动模式demo

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

    Android task和back stack

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

    Android Task Manager 实做

    在Android系统中,任务管理器(Task Manager)是至关重要的组件,它负责管理和调度应用程序的任务,确保系统的稳定运行。本文将深入探讨如何实现一个自定义的Android Task Manager,以及涉及的相关技术点。 首先,...

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

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

Global site tag (gtag.js) - Google Analytics