`
zhouYunan2010
  • 浏览: 207520 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类

Android多任务切换与Activity启动模式SingleTask之间关系的分析

阅读更多

       这里会以多个场景列子进行分析,在分析之前先了解一下基本的概念。

       Task任务:一系列Activity的集合,这些Activity以栈的形式进行排列(后进先出)。

       那在什么时候系统会新建一个Task任务呢?

       这个要以app来区分(注意,这里看Activity是否属于同一报名),当一个app以singleTask启动方式启动另外一个app的activity时,会新建一个Task任务,而第二个app的Activity会成为这个栈中的根。

       反之,在什么时候不会创建新任务呢?当一个app以非SingleTask方式启动另一个app时,或者在同一app内无论以什么方式启动其他Activity,都不会创建新的任务。

       上面的说法会在之后的场景中一一进行验证。

       长按HOME键后,在最近打开的任务中可以看见新创建的Task。

 

      各个应用程序都是由launch启动的,首先来分析launch这个Activity。launch是由系统启动(由ActivityManangerService启动),当launch启动后,相当于启动一个Task,简称Task1,launch这个Activity成为Task1维护的栈中的根元素。这里,当在launch中点击app1启动图标不会在Task1中继续添加,而是会为app1新建一个Task任务,原因如下

 boolean startActivitySafely(Intent intent, Object tag) {
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        try {
            startActivity(intent);
            return true;
        } catch (ActivityNotFoundException e) {}
}

         

       launch启动其他Activity都是以new task的方式启动的。这样每启动一个app,都会新建一个任务(如果任务不存在)。这样多个任务就产生了,点击HOME键的时候会启动Launch,相当于把Launch这个任务从后台移动到前台,这个时候继续点击app1,也就相当于把app1(前提app1的第一个activity在配置文件中的启动模式声明不是aingleTask)所在的任务移动到前台显示,而不会重新排布app1中所有Activity的位置。

 

模拟一下两个Task的场景

        场景1. 从Task1中的launch中打开app1,会新建Task2,Task2的根为Activity_a,启动模式为默认,从Activity_a中打开Activity_b.,然后从Activity_b中点击HOME回到Launch,再点击app1,这个时候相当于直接把Task2从后台移动到前台,Task1处于后台,Task2维护栈中的Activity位置不变,Activity_b依然处于栈顶,显示在最前端。

 

         场景2. 从Task1中的launch中打开app1,会新建Task2,Task2的根为Activity_a,启动模式为SingleTask,从Activity_a中打开Activity_b.,然后从Activity_b中点击HOME回到Launch,再点击app1,这个动作会先判断Task2的根Activity是否是SIngleTask,如果是,则执行Activity_a的onNewIntent()方法,destory掉Activity_b。如果不是直接把Task2移动到前台显示。

 

(注意:场景2如果不是从launch中点击图标进入,而是从显示的最近任务中进入,则不会判断根Activity的启动模式,会直接把Task2移动到前台。Task2中的Activity排列方式不变)

 

 

模拟一下3个Task的场景

       条件:Task1中一个Launch, Task2中app1含Activity_a,Activity_b , Task3中app2含Activity_D,Activity_E,Activity_F。

       场景1:从launch中进入Activity_a,然后进入到Activity_b,在Activity_b中以普通模式打开Activity_e(可以通过隐式启动打开),然后在Activity_E中打开Activity_F,虽然从Task2中打开了另一个app的Activity,但是由于是默认模式打开的,所以不会创建新任务Task3,Activity_E和Activity_F都属于Task2,,这时候点击Home键回到Launch,再点击app1,会把Task2移动到前台,显示出处于Task2最顶端的Activity_F,最近显示的任务中也不会出现Task3.

 

       场景2:从launch中进入Activity_a,然后进入到Activity_b,在Activity_b中以SingleTask模式打开Activity_e,然后在Activity_E中打开Activity_F,这个时候由于符合新建Task条件,不同app,singleTask启动,会新建Task3,然后在Activity_E中打开Activity_F,然后按home键进入到launch,发现最近任务中出现了task2,和task3,这时候点击app1发现Activity_b处于最顶端,点击app2发现该Task3已经存在,不会继续创建,显示Activity_F处于顶端,从Activity_F中点击返回键,依次回到Activity_E,最后launch,而不会回到Activity_D,因为Activity_D不在栈中。

 

 

 总结一下,

       1:要创建新任务,至少要满足两个条件:不同app和以SingleTask方式启动,否则在同一个app中以SingleTask方式打开Activity是不会新创建任务的。(这里有一个特殊情况,设置Activity的android:taskAffinity属性可以让Activity看起来是属于另一个包,属于另一个Activity)

       2.在最近任务中进行多个任务之间的相互切换时不会打乱每个任务中Activity的排列。但是在点击app图标进行多个任务切换时,系统会先判断该任务根Activity的启动模式是否为SingleTask,不是的话,不做任何操作,如果是的话,执行根Activity的onNewIntent方法,把覆盖在根Activity之上的Activity destory掉。

       3.当没有创建新任务时,新打开的Activity会一直进行当前任务中进栈,无论这些个Activity是属于哪一个App。

 

 

 

分享到:
评论

相关推荐

    Android中的任务栈与Activity的启动模式.pdf

    在Android系统中,任务栈(Task Stack)是管理和组织Activity的关键机制,它的主要目标是提供...不同启动模式的合理运用可以帮助开发者更好地控制Activity的生命周期和任务栈的行为,从而实现更高效、流畅的应用程序。

    Android各种超炫特效 Activity启动模式

    Activity的启动模式是Android系统管理Activity实例的一种机制,它决定了如何创建和管理Activity的生命周期,以及如何在不同的任务栈(Task)之间切换。本篇文章将深入探讨Android中的四种主要Activity启动模式:标准...

    Activity启动模式实验代码

    在Android应用开发中,Activity是用户界面的基本单元,它的启动模式是开发者必须了解的重要概念。本文将深入探讨Activity的不同启动模式,并通过实验代码进行详细解释。 一、Activity启动模式概述 1. **标准模式...

    android activity4种启动模式测试

    Android提供了四种不同的启动模式:标准模式(Standard)、单实例模式(SingleTop)、单任务模式(SingleTask)和单栈顶模式(SingleActivity)。下面我们将详细探讨这四种模式的特性和应用场景。 1. **标准模式...

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

    Activity的启动模式决定了它们在任务栈中的行为方式,从而影响用户操作流程和应用的切换。 Process是指应用程序的进程,它是由系统为运行应用中的组件而创建的一个执行环境。每个Android应用运行在自己的虚拟机实例...

    【Android进阶】(6)Activity启动模式和窗口导航

    本文将深入探讨Activity的四种启动模式——Standard、SingleTop、SingleTask和SingleInstance,以及如何通过窗口导航实现流畅的界面切换。 **一、Activity启动模式** 1. **Standard(默认模式)** - 每次启动都会...

    Android自学笔记-16-任务栈

    文件"11_taskStack"可能包含了针对任务栈的实际编程示例,如通过不同的Intent Flag启动Activity,演示如何处理任务切换、回退以及Activity之间的关系。学习这部分内容,你可以更直观地理解任务栈的工作原理,并将其...

    Android启动模式

    本文将深入解析Android中的四种主要启动模式:标准模式(standard)、单实例模式(singleInstance)、单任务模式(singleTask)以及单栈顶模式(singleTop),并结合提供的源码进行分析。 1. **标准模式(standard...

    简单介绍Android中Activity的四种启动模式

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。 Activity有四种启动模式: 1. standard,默认的启动...

    activity的启动方式

    本文将详细讲解Activity的几种启动模式及其特点。 1. **标准模式(Standard)** 这是Activity的默认启动模式,每次启动都会创建一个新的实例。如果栈中已有该Activity的实例,系统会创建新的实例并将其压入栈顶。...

    Android-一个封装了启动模式的Fragment便捷使用库方便构建单Activity多Fragment轻量级框架

    "Android-一个封装了启动模式的Fragment便捷使用库方便构建单Activity多Fragment轻量级框架"就是一个针对这一需求的开源库,它提供了更方便的方式来管理和控制Fragment的启动模式。 首先,让我们了解Fragment的基本...

    activity四大启动方式demo

    "activity四大启动方式demo"指的是展示如何通过四种不同的启动模式来启动一个Activity。这些模式影响着Activity的生命周期以及在任务栈(Task)中的行为。下面将详细解释这四种启动模式及其在实际开发中的应用场景。...

    activity 四种工作模式

    Activity有四种不同的工作模式,这些模式决定了当用户在多个Activity之间切换时,它们如何被管理以及内存如何使用。理解并掌握这些模式对于优化应用的用户体验和性能至关重要。 1. **标准模式(Standard)** 标准...

    Android编程中Activity的四种启动模式

    本文将深入解析Android的四种Activity启动模式:standard、singleTop、singleTask以及singleInstance。 1. standard(标准模式) 这是Activity的默认启动模式,每次启动时都会创建一个新的Activity实例。这意味着...

    模仿微信activity水平切换效果.zip

    1. **Activity的启动模式**:在Android中,Activity有多种启动模式,如标准模式、单实例模式、栈顶复用模式等。此处模拟微信效果,可能使用了栈顶复用模式(SingleTask)或者标准模式(Standard),以便在切换时保持...

    Android Activity LaunchMode例子

    在Android应用开发中,Activity是用户界面的基本单元,而LaunchMode是...开发者应根据具体需求选择合适的模式,以实现理想的导航和任务切换行为。LunchModeDemo提供的实践案例可以帮助开发者更好地理解和掌握这些概念。

    多个Activity跳转的小结

    Android提供了四种主要的启动模式:标准模式(Standard)、单实例模式(SingleTop)、单任务模式(SingleTask)和单栈顶模式(SingleInstance)。标准模式是最常见的,每次启动都会创建新的Activity实例。单实例模式...

    Activity跳转页面切换漂亮效果(转)

    Activity有四种启动模式:标准模式(Standard)、单实例模式(SingleTop)、单任务模式(SingleTask)和单栈顶模式(SingleActivity)。不同的启动模式会影响Activity的生命周期和堆栈管理,对动画的应用有间接影响...

Global site tag (gtag.js) - Google Analytics