`
hunankeda110
  • 浏览: 747086 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多

task就好像是能包含很多activity的栈。 默认情况下,一个activity启动另外一个activity时,两个activity是放在同一个task栈中的,第二个activity压入第一个 activity所在的task栈。当用户按下返回键时,第二个activity从栈中弹出,第一个activity又在当前屏幕显示。这样,从用户角度来看,这两个activity就好像是属于同一个应用程序的,即使第二个activity是属于另外一个应用程序的。当然,这是指默认情况下。 task栈包含的是activity的对象。如果一个activity有多个实例在运行,那么栈中保存的是每个实例的实体。栈中的activity不会重新排列,只有弹出和压入操作。 一个task中的所有activity都以整体的形式移动。整个task可以被移到前台或后台。打个比方,当前的task包含4个activity–当前 activity下面有3个activity。当用户按下HOME键返回到程序启动器(application launcher)后,选择了一个新的应用程序(事实上是一个新的task),当前的task就被转移到后台,新的task中的根activity将被显示在屏幕上。过了一段时间,用户按返回键回到了程序启动器界面,选择了之前运行的程序(之前的task)。那个task,仍然包含着4个 activity。当用户再次按下返回键时,屏幕不会显示之前留下的那个activity(之前的task的根activity),而显示当前 activity从task栈中移出后栈顶的那个activity。 刚刚描述的行为是默认的activity和task的行为。有很多方法能够改变这种行为。activity和task之间的联系,以及task中的 activity的行为可以通过intent中的标记 以及在manifest中的<activity>元素的属性 控制。其中,主要的Intent标记有:

  • 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

默认情况下,一个应用程序中的所有activity都有一个affinity–这让它们属性同一个task。然而,每个activity可以通过<activity>中的taskAffinity属性设置单独的affinity。不同应用程序中的activity可以共享同一个 affinity,同一个应用程序中的不同activity也可以设置成不同的affinity。affinity属性在2种情况下起作用:当启动 activity的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记,或当activity的 allowTaskReparenting被设置成true。 FLAG_ACTIVITY_NEW_TASK 标记

当传递给startActivity()的Intent对象包含 FLAG_ACTIVITY_NEW_TASK标记时,系统会为需要启动的activity寻找与当前activity不同的task。如果要启动的 activity的affinity属性与当前所有的task的affinity属性都不相同,系统会新建一个带那个affinity属性的task,并将要启动的activity压到新建的task栈中;否则将activity压入那个affinity属性相同的栈中。

allowTaskReparenting属性

如果一个activity的allowTaskReparenting属性为true,那么它可以从一个task(TASK1)移到另外一个有相同affinity的task(TASK2)中(TASK2带到前台时)。

如果一个.apk文件从用户角度来看包含了多个“应用程序”,你可能需要对那些 activity赋不同的affinity值。

运行模式

activity的launchMode属性可以有四种值:

  • standard ” (默认)
  • singleTop
  • singleTask
  • singleInstance

这4种模式可以按4种分类来区分,以下假设位于task1中的activity1启动activity2:

模式/分类 包容activity2的task 一个activity是否允许有多个实例 activity是否允许有其它activity共存于一个task 对于新的intent,是否总是实例化activity对象
standard 如果不包含FLAG_ACTIVITY_NEW_TASK标记,则activity2放入 task1,否则按前面讲述的规则为activity2选择task 可被多次实例化,同一个task的不同的实例可位于不同的task中,每个task也可包含多个实例 允许 是的。当接收到新的intent时,总是会生成新的activity对象。
singleTop 同standard 同standard 允许 已存在的activity对象,如果位于目标task的栈顶,则该activity被重用,如果它不位于栈顶,则会实例化新的activity对象
singleTask 将activity2放到task1栈底 不能有多个实例。由于该模式下activity总是位于栈顶,所以actvity在同一个设备里至多只有一个实例 允许。singleTask模式的activity总是位于栈底位置。目标activity 实例已存在时,如果该实例刚好位于task栈顶,则接收intent,否则到来的intent将会被丢弃,但该可以响应该intent的那个 activity所在的task将会被移到前台。  
singleInstance 同singleTask 同singleTask 不允许与其它activity共存于一个task。如果activity1的运行在该模式下,则activity2一定与activity1位于不同的task  

对于新到的intent,如果是由新创建的activity对象来接收,则用户可以通过返回键回到之前的activity;如果是由已存在的 activity来接收,则用户无法通过返回键返回到接收intent之前的状态。

清空栈

当用户长时间离开task(当前task被转移到后台)时,系统会清除task中栈底activity外的所有activity。这样,当用户返回到task时,只留下那个task最初始的activity了。

这是默认的情况,<activity>中有些属性可以改变这种行为。

alwaysRetainTaskState属性

如果栈底activity的这个属性被设置为true,刚刚描述的情况就不会发生。 task中的所有activity将被长时间保存。

clearTaskOnLaunch属性

如果栈底activity的这个属性被设置为true,一旦用户离开task,则 task栈中的activity将被清空到只剩下栈底activity。这种情况刚好与alwaysRetainTaskState相反。即使用户只是短暂地离开,task也会返回到初始状态(只剩下栈底acitivty)。

finishOnTaskLaunch属性

这个属性与clearTaskOnLaunch相似,但它只对单独的activity操作,而不是整个task。它可以结束任何activity,包括栈底的activity。当它设置为true时,当前的activity只在当前会话期间作为task的一部分存在,当用户退出activity再返回时,它将不存在。

另外还有一种方法能将activity强行从stack中移出。如果intent对象包含FLAG_ACTIVITY_CLEAR_TOP 标记,当目标task中已存在与接收该intent对象的 activity类型相同的activity实例存在时,所有位于该activity对象上面的activity将被清空,这样接收该intent的 activity就位于栈顶,可以响应到来的intent对象。如果目标activity的运行模式为standard,则目标activtiy也会被清空。因为当运行模式为standard时,总会创建新的activity对象来接收到来的intent对象。

FLAG_ACTIVITY_CLEAR_TOP标记常常和FLAG_ACTIVITY_NEW_TASK一起使用。用2个标记可以定位已存在的 activity并让它处于可以响应intent的位置。

启动任务(Task)

Intent filter中有”android.intent.action.MAIN ” action和”android.intent.category.LAUNCHER ” category的activity将被标记为task的入口。带有这两个标记的activity将会显示在应用程序启动器(application launcher)中。

第二个比较重要的点是,用户必须能够离开task并在之后返回。因为这个原因,singleTask和singleInstance这两种运行模式只能应用于含有MAIN和LAUNCHER过滤器的 activity 。打个比方,如果不包含带MAIN和LAUNCHER过滤器,某个activity运行了一个singleTask模式的 activity,初始化了一个新的task,当用户按下HOME键时,那个activity就被主屏幕“挡住”了,用户再也无法返回到那个 activity。

类似的情况在FLAG_ACTIVITY_NEW_TASK标记上也会出现。如果这个标记会新建一个task,当用户按下HOME键时,必须有一种方式能够让用户返回到那个activity。有些东西(比如notification manager)总是要求在外部task中启动activity,在传递给startActivity的intent中总是包含 FLAG_ACTIVITY_NEW_TASK标记。

对于那种不希望用户离开之后再返回activity的情况,可将finishOnTaskLaunch属性设置为true。

2
0
分享到:
评论

相关推荐

    Activity堆栈管理demo

    Activity堆栈管理是Android系统为了维护应用状态和用户导航而采用的一种机制,这正是"Activity堆栈管理demo"所要探讨的主题。在这个示例中,我们将深入理解Activity的生命周期、任务(Task)和返回栈(BackStack),...

    035_android_Activity入门和跳转

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

    Android activity堆栈及管理实例详解

    Activity堆栈,也称为任务堆栈,是一种“后进先出”(LIFO)的数据结构,用于管理Android应用中的Activity实例。每当用户启动一个新的Activity或者在现有Activity之间导航时,这些Activity都会按照它们被启动的顺序...

    activity

    3. **Activity堆栈管理**:Android系统使用Task和Back Stack来管理Activity。当启动新的Activity时,它会被添加到当前Task的堆栈顶,遵循“后进先出”(LIFO)原则。按下Back键时,会弹出堆栈顶的Activity,直到Task...

    Android-Floo支持AOP堆栈控制跨页消息和动态路由的URL路由器

    在Android中,Activity堆栈管理不当可能导致内存泄漏或用户界面问题。Floo提供了一种机制,可以控制Activity如何被添加到堆栈中,何时返回,甚至可以进行堆栈清理,从而避免状态混乱和不必要的资源消耗。 ### 跨页...

    Activity-:Activity堆栈式管理

    import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import com.ideacode.news.logic.IdeaCodeActivity; public class AppManager { private static Stack ...

    Android从初级到高级代码九

    5. **Activity堆栈管理**:Android使用任务(Task)和堆栈(Stack)来管理Activity。每个任务都有一个后进先出(LIFO)的Activity堆栈。默认情况下,每次启动新的Activity都会压入当前任务的堆栈,而按回退键会弹出堆栈...

    任务管理器源码.zip

    2. **Activity管理**:Activity是Android应用程序的基本组件,ActivityStackSupervisor和ActivityStack类是负责Activity堆栈管理和调度的关键。它们维护着应用的启动、暂停、恢复和销毁状态,确保用户界面的正确流转...

    安卓实验报告

    6. **Activity堆栈管理**:Android系统采用“后进先出”(LIFO)的Activity堆栈管理方式,新启动的Activity被压入栈顶,用户回退时,栈顶的Activity会被销毁。理解这个机制有助于设计合理的应用流程和用户体验。 7....

    多个Activity管理的例子

    栈管理是Android系统默认的Activity管理方式,即"后进先出"(LIFO)的Task堆栈。每次启动新的Activity,都会被压入栈顶,当用户按回退键时,栈顶的Activity会被销毁并弹出。开发者可以通过设置Activity的启动模式...

    android API-DEMOS中文解析文档

    这部分内容涉及Activity堆栈管理,包括如何重新排序Activity以适应不同的应用场景。 #### 2.14 App-&gt;Activity-&gt;Save&RestoreState 深入介绍了如何保存和恢复Activity的状态,这对于处理旋转屏幕等情况非常有用。 #...

    Android Activity生命周期和堆栈管理的详解

    Android Activity生命周期和堆栈管理的详解 Android Activity生命周期是指Activity从创建到销毁的整个过程,包括了七个回调方法:onCreate、onStart、onRestart、onResume、onPause、onStop、onDestroy。这些方法...

    Android 中从activity1跳转到activity2再回到activity所经历的生命周期

    此时,Activity位于Activity堆栈的顶部,拥有用户焦点。这里使用`Log.i("activity", "onResume1")`进行记录。 当用户点击按钮触发Activity2的启动时: 4. **onPause()**: 当Activity失去用户焦点时调用。在我们的...

    Activity Manager

    2. **管理Activity堆栈**: Activity Manager按照后进先出(LIFO)的原则维护一个Activity堆栈。新启动的Activity会被压入堆栈顶部,当前正在运行的Activity位于堆栈顶部,当用户返回或关闭Activity时,位于堆栈顶部...

    获取栈顶的activity

    Android的Activity是以任务(Task)为单位组织的,每个任务是一个Activity堆栈,新启动的Activity会被压入堆栈顶部,用户操作会从堆栈顶部的Activity开始。当用户按回退键或通过其他方式退出时,栈顶的Activity会被...

    Activity栈的简单应用.rar

    在Android系统中,所有的Activity都被组织在一个称为任务(Task)的结构中,而任务内部则由一个Activity堆栈(BackStack)来管理。这个堆栈遵循“后进先出”(LIFO)的原则,也就是最后启动的Activity会位于栈顶,...

    Android利用Intent启动和关闭Activity

    但在大多数情况下,系统的Activity管理机制足以处理Activity的生命周期,无需手动调用`finish()`。 ```java // 关闭当前Activity finish(); ``` 此外,如果需要关闭之前启动的独立Activity,可以使用`finish...

    androidcode:练习小项目

    6. **Activity堆栈管理(Back Stack)**: Android使用任务(Task)和Activity堆栈来管理应用的导航历史。在处理通知启动Activity时,需要考虑如何影响堆栈,比如是否要清除所有之前的Activity,或者保持当前的导航...

    Android开发之Activity管理工具类完整示例

    例如,要添加一个Activity到堆栈中,可以使用addActivity方法,要移除一个Activity,可以使用removeActivity方法。 4. Activity管理工具类的优点 Activity管理工具类有很多优点,例如: * 简化了Android应用程序...

Global site tag (gtag.js) - Google Analytics