zoukankan      html  css  js  c++  java
  • 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任务,原因如下

    Java代码  收藏代码
    1.  boolean startActivitySafely(Intent intent, Object tag) {  
    2.         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
    3.         try {  
    4.             startActivity(intent);  
    5.             return true;  
    6.         } catch (ActivityNotFoundException e) {}  
    7. }  

             

           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。

  • 相关阅读:
    CREATE AGGREGATE
    技术文档列表
    jQuery 判断表单中多个 input text 中至少有一个不为空
    Java实现 蓝桥杯 算法提高 奥运会开幕式
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最大值路径
    Java实现 蓝桥杯 算法提高 最大值路径
    Java实现 蓝桥杯 算法提高 最大值路径
  • 原文地址:https://www.cnblogs.com/kobe8/p/3979601.html
Copyright © 2011-2022 走看看