Android启动模式

(1)Task:与Android系统是个多任务的系统中的任务是不同的。后者更倾向于多进程和多线程来说的,而这里的任务与application(应用程序)和activity(活动)有关系. 从activity的角度说,任务就是activity的集合,共同完成一项工作。这些activity排列在一个栈中,这就有了下面的概念,Back栈。

(2)Back Stack(后退栈):activity按照打开的顺序排列,形成的栈,通常我们也可以说是任务栈。如果用户长时间离开task(比如30分钟),系统会清理这个栈中除了根activity以外的所有activity,当用户再次回来的时候,只有根activity在栈中。

android:launchMode=["standard"|"singleTop"|"singleTask"|"singleInstance"]

默认值为standard。

(1) standard || singleTop

一个Activity是“standard”或“singleTop”启动模式,可以被实例化多次。一旦有一个新的intent给“standard”activity,一个响应这个intent的新的实例就会被创建。每个实例会处理单独的intent。同样,一个“singleTop”activity的实例可能也会被创建去处理新的intent。然而,如果目标task已经存在一个此activity的实例在栈顶,这个实例会收到这个新intent(在onNewIntent中回调),新的实例就不会被创建了。

回调onNewIntent()方法:

  @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.i(TAG, "onNewIntent()");

}

(2)SingleTask  ||  singleInstance

“singleTask” activity允许其他activity成为task中的一部分 ,并且它通常在task栈的根部,其它activity(必须是“standard”和“singleTop”模式的activity)可以加载到这个栈上。

另一方面,“singleInstance”模式的activity不允许任何其它activity加载到这个task栈上。它是这个task中唯一的activity。如果它启动另一个activity,那个activity会被指引到不同的task中,这个行为就像在intent中用FLAG_ACTIVITY_NEW_TASK标记一样。

(通常来说,AndroidManifest中用“singleTask”启动模式和在intent中用FLAG_ACTIVITY_NEW_TASK标记的行为是一样的)。

(3)Intent中activity相关的6个Flag

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_CLEAR_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_NO_HISTORY

FLAG_ACTIVITY_REORDER_TO_FRONT

1、  FLAG_ACTIVITY_NEW_TASK

与启动模式中的“singleTask”行为相同。

2、  FLAG_ACTIVITY_SINGLE_TOP

与启动模式中的“singleTop”行为相同。

3、  FLAG_ACTIVITY_CLEAR_TASK

必须要与FLAG_ACTIVITY_NEW_TASK配合使用,这个activity新启动一个栈,原来栈被清空,栈中的activity也被销毁。

4、  FLAG_ACTIVITY_CLEAR_TOP

A B C D四个activity在一个栈中,用此flag启动B,原来的B被唤出来,CD被clear。不能与FLAG_ACTIVITY_SINGLE_TOP同用。

可以和FLAG_ACTIVITY_NEW_TASK同用。

5、  FLAG_ACTIVITY_NO_HISTORY

当离开activity并不可见时,此activity会从栈中移除并不留下记录。

6、  FLAG_ACTIVITY_REORDER_TO_FRONT

重新排列栈中activity的顺序。如:栈中有A B C D四个activity,用此flag启动B,原来的B被唤起到栈顶。重新排序后顺序:A C D B

(4)Activity的其他属性:

android:allowTaskReparenting=["true" | "false"]

android:alwaysRetainTaskState=["true" | "false"]

android:clearTaskOnLaunch=["true" | "false"]

android:finishOnTaskLaunch=["true" | "false"]

android:noHistory=["true" | "false"]
android:taskAffinity="string"

这些属性都是在Manifest中定义的:

1、taskAffinity:task的亲属关系,设置的字符串应该是另一个task名,通常情况下是一个application的名称。拥有相同taskAffinity的activity同属于一个task,从用户角度来看是属于同一个应用程序(application)。一个task的亲属关系取决于task的根activity。

它是个很重要的属性,它会配合其他属性和flag共同影响activity的行为。首先它与“singleTask”模式或FLAG_ACTIVITY_NEW_TASK Flag配合,启动后此activity会属于另一个task,task名就是taskAffinity的设置值。其次,它会和allowTaskReparenting属性配合使用,详见allowTaskReparenting。

默认情况下,一个application中的所有activity同属于一个亲属关系。如果想让activity不属于任一个task,那么把taskAffinity的值设为空吧。如果你不设它,那么系统会为你默认为所属application的名称,也就是在manifest中的package名。

2、allowTaskReparenting:与字面理解相同,本属性允许activity重新指定Task。默认值是false。通常情况下我们不设置此属性,activity在生命周期中只属于一个Task。而设置成true后,需要与taskAffinity属性配合使用,当原来的task转到后台,亲属task转到前台,那么此时activity就会属于当前的task。

3、alwaysRetainTaskState:总是保留task的状态。默认值是false。此时会遵循系统的清理栈的行为。如果设置为true,系统会保留栈中所有activity及其状态,当用户再次回来的时候,发现一切如初。

4、clearTaskOnLaunch:当再次启动task时,系统会清理掉除了根activity以外的所有activity。默认值是false。

5、finishOnTaskLaunch:这个属性与上面的clearTaskOnLaunch很像,不过它是指单个activity的,而不是整个栈。当设置为true时,task重启后,这个activity就不显示了。默认值为false。优先级高于allowTaskReparenting。

6、noHistory:如果设置true,当离开activity并不可见时,此activity会从栈中移除并不留下记录。默认值为false。与上面FLAG_ACTIVITY_NO_HISTORY行为相同。

android 启动模式介绍的更多相关文章

  1. android MVP模式介绍与实战

    android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...

  2. Android 启动模式--任务(Task)--桟 的误区

    Android 启动模式--任务(Task)--桟 的误区 写这篇文章是因为前几天的一次面试,面试官说SingleInstance模式会新建一个桟,而SingleTask不会.首先不说这个对不对(非要 ...

  3. Android启动模式launchMode

    在Android里,有4种Activity的启动模式并分别介绍下: standard singleTop singleTask singleInstance AndroidManifest.xml配置 ...

  4. android启动模式2

    Android中的启动模式(下) 在这篇文章中,我会继续跟大家分享有关于Android中启动模式的相关知识.当然,如果对这个启动模式还不完全了解或者没有听过的话,可以先看看我之前写的有关于这个知识点的 ...

  5. 我所理解的Android 启动模式

    首先,这是从 一个开源网站转载的,觉得写得不错,对我们之前理解的activity的启动模式是一个新的理解方式,并给出实际的应用场景. 任务栈是什么 任务栈Task,是一种用来放置Activity实例的 ...

  6. Android启动模式之singleinstance的坑

    前言 在实际应用中,使用singleinstance启动模式时,会遇到一些奇奇怪怪的问题.Android有四种启动模式,分别是standard,singleTop,singleTask,singleI ...

  7. Android -- 启动模式

    Android的启动模式分为四种: standard 模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中. singleTop 如果在任务的栈顶正好存在该Activity ...

  8. android启动模式对于体验的影响

    说到Android的启动模式.懂Android的人肯定都懂. 通过设置启动模式我们不仅能够节省内存的使用.还能达到更好的体验,比方我们打开一个应用,点击home键回到主界面的时候程序是没有被kill掉 ...

  9. Android启动模式

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...

随机推荐

  1. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  2. 小丁带你走进git的世界二-工作区暂存区分支

    小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git  init git  clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...

  3. Android开发学习之路-插件安装、检查应用是否安装解决方案

    使用Bmob的时候,如果需要用到支付功能,就需要让应用去安装一个支付插件.而一般的做法是将插件放置在assets目录中,当用户需要支付,先检查是否能支付,不能的话,提示安装插件.代码: public ...

  4. Atitit zxing二维码qr码识别解析

    Atitit zxing二维码qr码识别解析 1.1. qr码识别解析 by zxing1 1.2. 解码lib:qrcode.jar  2 1.3. atitit.二维码生成总结java zxing ...

  5. xcode低版本调试高版本真机系统

    低版本xcode调试本真机高版本系统 //打开此路径把最新的文件拷贝到这里就可以了 /Applications/Xcode.app/Contents/Developer/Platforms/iPhon ...

  6. js基本类型和引用类型

    先来两个例题 //1. var person; person.age=10; console.log(person.age) //undefined person是字符串而不是对象,没有属性 //2. ...

  7. 高性能JavaScript--数据存储(简要学习笔记二)

    1.JavaScript中四种基本数据存取位置:字面量,本地变量,数组元素,对象成员. 一般来说:[字面量,局部变量]运行速度>[数组,对象成员]   2.内部属性包含了一个函数被创建的作用域中 ...

  8. ElasticSearch 5学习(3)——单台服务器部署多个节点

    一般情况下单台服务器只会部署一个ElasticSearch node,但是在学习过程中,很多情况下会需要实现ElasticSearch的分布式效果,所以需要启动多个节点,但是学习开发环境(不想开多个虚 ...

  9. java注意的一些细节问题

    1. 大括弧作用域问题 public static void main(String[] args) { { int x; { int x;//编译错误:Duplicate local variabl ...

  10. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(14)-EasyUI缺陷修复与扩展

    系列目录 不知不觉已经过了13讲,(本来还要讲多一讲是,数据验证之自定义验证,基于园友还是对权限这块比较敢兴趣,讲不讲验证还是看大家的反映),我们应该对系统有一个小结.首先这是一个团队开发项目,基于接 ...