本文参考了此文http://hi.baidu.com/amauri3389/blog/item/a54475c2a4b2f040b219a86a.html

另附 android task与back stack开发文档翻译

参见:http://mypyg.iteye.com/blog/919643     http://blog.csdn.net/infsafe/article/details/5666964

(本文转自https://www.cnblogs.com/xiaoQLu/archive/2011/09/29/2195742.html)

Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance。以下逐一举例说明他们的区别:

standard:Activity的默认加载方法,即使某个Activity在Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中。例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为: A B C D D 。此时如果栈顶的D通过Intent跳转到B,则栈情况为:A B C D D B。此时如果依次按返回键,D  D C B A将会依次弹出栈而显示在界面上。

singleTop:如果某个Activity的Launch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中。例如:现在栈的情况为:A B C D。D的Launch mode设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例压入栈中,此时栈的情况依然为:A B C D。但是如果此时B的模式也是singleTop,D跳转到B,那么则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时栈的情况就变成了:A B C D B。

singleTask:如果某个Activity是singleTask模式,那么Task栈中将会只有一个该Activity的实例。例如:现在栈的情况为:A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。

关于singleTask这个网上颇有争议,google api说singTask模式只能启动一个task,且总是位于栈底,这个也不是完全正确

分2种情况:

  1、如果在同一个应用(apk)中使用singleTask,刚不在栈底,对应于下面的情况一

  2、如果从不同应用启动一个singleTask的activity,刚依赖于此activity所在的栈,如果之前没有运行过,则新建栈处于栈底,如果有运行过,则有可能不在栈底,对应于情况二

 情况一:如果在本程序中启动singleTask的activity:假设ActivityA是程序的入口,是默认的模式(standard),ActivityB是singleTask 模式,由ActivityA启动,刚ActivityB不会位于栈底,不是根元素,不会启动新的task,此种情况ActivityB会和ActivityA在一个栈中,位于ActivityA上面

  情况二:如果ActivityB由另外一个程序启动:假设apkA是情况一中的应用,apkB是另外一个测试程序,在apkB中启动apkA中的ActivityB,再分两种情况,如果ActivityB未启动过,刚ActivityB会位于栈底,是根元素,会启动新的task;如果ActivityB启动过,则ActivityB保持原来的位置不变,在栈底或者栈顶,移除掉ActivityB之上所有的activity(如果有),见下图

此图就是保存了activitY所在的栈的情况,按返回键的时候,会首先依次移除掉activitY所在的栈的activity,然后才是activity2的

注意:singleTask模式的Activity不管是位于栈顶还是栈底,再次运行这个Activity时,都会destory掉它上面的Activity来保证整个栈中只有一个自己,切记切记

singleInstance:将Activity压入一个新建的任务栈中。例如:Task栈1的情况为:A B C。C通过Intent跳转到D,而D的Launch mode为singleInstance,则将会新建一个Task栈2。此时Task栈1的情况还是为:A B C。Task栈2的情况为:D。此时屏幕界面显示D的内容,如果这时D又通过Intent跳转到D,则Task栈2中也不会新建一个D的实例,所以两个栈的情况也不会变化。而如果D跳转到C,则栈1的情况变成了:A B C C,因为C的Launch mode为standard,此时如果再按返回键,则栈1变成:A B C。也就是说现在界面还显示C的内容,不是D。

好了,现在有一个问题就是这时这种情况下如果用户点击了Home键,则再也回不到D的即时界面了。如果想解决这个问题,可以为D在Manifest.xml文件中的声明加上:

<intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>

加上这段之后,也就是说该程序中有两个这种声明,另一个就是那个正常的根activity,在打成apk包安装之后,在程序列表中能看到两个图标,但是如果都运行的话,在任务管理器中其实也只有一个。上面的情况点击D的那个图标就能回到它的即时界面(比如一个EditText,以前输入的内容,现在回到之后依然存在)。

PS:intent-filter中 <action android:name="android.intent.action.MAIN" />和 <category android:name="android.intent.category.LAUNCHER" />两个过滤条件缺一不可才会在程序列表中添加一个图标,图标下的显示文字是android:label设定的字符串。

转载于:https://www.cnblogs.com/Sharley/p/10429326.html

Activity的Launch mode详解,A B C D的singleTask模式相关推荐

  1. 详解Spring Security的formLogin登录认证模式

    详解Spring Security的formLogin登录认证模式 一.formLogin的应用场景 在本专栏之前的文章中,已经给大家介绍过Spring Security的HttpBasic模式,该模 ...

  2. TSS详解 ——《x86汇编语言:从实模式到保护模式》读书笔记33

    TSS(Task State Segment,任务状态段)详解 1. TSS描述符 和LDT一样,必须为每个TSS在GDT中创建对应的描述符.TSS描述符的格式如下图: B位是"忙" ...

  3. tracepro应用实例详解_腾讯云服务器计费模式包年包月、按量计费和竞价实例选择建议...

    腾讯云服务器计费模式包年包月.按量计费和竞价实例有什么区别?如何选择腾讯云服务器计费模式,云服务器包年包月和按量计费哪个更划算?腾讯云服务器网来详细说下同腾讯云服务器包年包月.按量计费和竞价实例详细说 ...

  4. boos里的AHCI RAID_希洛克团本详解 DNF国服环境下Raid困难模式

    随着9月底的临近,大部分玩家都在期待着本月底的金秋版本更新,而全新的金秋版本给大家带来的主要内容之一当然还是大家期待了很久的全新团本希洛克Raid.那么国服里的希洛克具体是什么样的呢?快跟小编一起走进 ...

  5. Redis详解(十五)------ 集群模式详解

    1.为什么需要集群? ①.并发量 通常来说,单台Redis能够执行10万/秒的命令,这个并发基本上能够满足我们所有需求了,但有时候比如做离线计算,为了更快的得出结果,有时候我们希望超过这个并发,那这个 ...

  6. VMware虚拟机三种网络模式详解(一)Bridged(桥接模式)

    由于Linux目前很热门,越来越多的人在学习Linux,但是买一台服务放家里来学习,实在是很浪费.那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有VMware Workstations ...

  7. android 启动过程详解,Activity的启动过程详解(基于Android10.0)

    一.概述 话说Android中有四大组件:Activity.Service.BroadcastReceiver.ContentProvider.咱们最常接触也是用户直接感受到的便是Activity了, ...

  8. 一个普通handler会持有activity引用吗_详解handler机制

    Android中有很多机制,打开源码最先遇到的应该就是handler机制了,handler主要为了解决线程间通讯的问题,首先看一下handler该怎么用. ##handler的用法 1.在主线程中用h ...

  9. 安卓Activity的生命周期函数详解

    首先上个官图: http://developer.android.com/reference/android/app/Activity.html 记住核心方法:onStart().onStop() o ...

最新文章

  1. java 图片转zpl 数据,使用Zebra 打印机打印
  2. 通信专业学python有用吗-一起学Python:网络通信过程
  3. 零基础如何学python-零基础小白如何学python,想请教大家,求指导 ?
  4. python中文名字叫什么-什么是Python
  5. NEO改进协议提案2(NEP-2)
  6. 【第一季】CH07_FPGA_RunLED创建VIVADO工程实验
  7. 2021牛客多校3 - Black and white(思维+最小生成树)
  8. python 字符串替换换行,Python fstring:替换换行符/lineb
  9. Guice系列之用户指南(八)
  10. 常见的windows 命令大全
  11. android studio gradle下载
  12. 网页中的字体对应的word字体大小对照表
  13. 经纬度坐标转换xy坐标 python_Python 高斯坐标转经纬度算法
  14. 项目落地 - 智能焊机,钢塑管(物联网技术应用)
  15. 谷歌 火狐 主页被篡改,修改文件名解决
  16. 如何装配一台计算机和安装操作系统,组装机怎么安装系统?手把手教你组装机安装系统教程...
  17. 05LaTeX学习系列之---TeX的命令行操作
  18. 操作系统学习之文件管理:
  19. 我想做产品,滴滴优步怎么优化
  20. 微信公众号通过图片选取接口上传到阿里oss

热门文章

  1. Shell脚本监控LVS后台服务器存活状态
  2. Kubernetes 常见运维技巧总结
  3. Ecliplse安装tomcat插件
  4. 关于IT测试中的一些问题。
  5. java中的subString与SQL中的subString(作为常识应该记住的)
  6. 【Python】AttributeError: 'Series' object has no attribute 'order'
  7. CSS兼容性问题的解决方式(更新中···)
  8. Spring Boot 解决方案 - 会话
  9. 关于微信中的localStorage及使用cookie的解决方案
  10. 如何使用代码确定设备屏幕大小类别(小,普通,大,xlarge)?