生活本来就不容易啊,而我们的不努力只会让生活变得更加无赖。

今天看了*《Android群英传》*的有关Activity调用栈的相关知识,所以得来写点东西记录今天的收获。

  • 回想当初学习*《第一行代码》*的时候也看到过这图,号称开始那几年Android面试必问的知识点,所以po上来表示膜拜。下面入正题: Android的调用栈 Android是利用数据结构中的栈来管理Activity的,利用栈是因为它的后进先出(Last In First Out)特性可以在正常情况下良好的管理和决定Activity的状态。 比如当一个ActivityA启动另一个ActivityB时,ActivityB处于活动状态,而ActivityA被压在栈底,处于停止状态。当用户按下Back键或者调用finish()方法后,ActivityA重新处于活动状态进行交互这么一种“和谐”的状态。但是,并不是所有的Activity都这么“和谐”。所以Google提供了几种“特权”让Activity有权力!赋予Activity的权力可以通过AndoridMainifestandroid:launchMode属性或者直接通过Intent两种方式。

AndroidMainifest启动模式

  • standard
  • singleTop
  • singleTask
  • singleInstance
  1. standard Activity默认的启动模式,每次创建Activity都会new出一个新的实例。如下图:
  2. singleTop
  • 系统会判断栈顶Activity是否为所需Activity,是则直接引用,否则新建。(QQ接收信息时,如果在此界面接收到多条信息,直接引用而非new多次实例)
  • 栈顶ActivityA接收请求需启动ActivityA,则只会调用其onNewIntent()方法。
  1. singleTask
  • 这种模式与singleTop类似,但此模式是查找整个Activity栈(同一任务栈)是否存在所需Activity,存在则将其后压栈的Activity全部销毁致使目标Activity位于栈顶(可以利用这种模式,用来退出整个应用。将主Activity设置为singleTask模式,在需要退出的Activity跳转到主Activity,将任务栈清空,利用主Activity中的onNewIntent()方法中调用finish()即退出)。
  • 当处于不同任务栈的Activity被启动时,将把其整个任务栈引入,当按下back键时,需退出这个任务栈所有Activity时才能对原任务栈进行操作(如下图)。
  1. singleInstance
    书上说这种模式,会新建一个任务栈。其原理与浏览器的工作原理相类似。多个程序访问浏览器时。如果浏览器已开则直接访问,没有则打开浏览器后访问。 singleTop与singleInstance还有一点需注意:如果ActivityA中调用startActivityForResult()启动另外一个时,系统会自动返回Activity.RESULT_CACELED而不会再等待返回。

Intent Flag启动模式

  1. Intent.FLAG_ACTIVITY_SINGLE_TOP(singleTop效果相同)
  2. Intent.FLAG_ACTIVITY_CLEAR_TOP(singleTask效果相同)
  3. Intent.FLAG_ACTIVITY_NO_HISTORY(该模式下,ActivityA启动ActivityB后,ActivityA小时)

清空任务栈

  • clearTaskOnLaunch(每次返回该Activity时,其Activity上的Activity全部销毁)
  • finishOnTaskLaunch(离开所在的Activity栈,后返回此Activity被finifh()掉)
  • alwaysRetainTaskState (“免死金牌”,当Activity的此属性设置为true,不接受任何销毁命令)

**总结:**其实网上这些文章有很多而且写的很透彻,例如老罗的啊,但是自己写下来感觉会不一样。

Activity调用栈的分析相关推荐

  1. 【Android 返回堆栈管理】打印 Android 中当前运行的 Activity 任务栈信息 | Activity 任务栈信息分析 | Activity 在相同 Stack 中的不同 Task

    文章目录 一.打印 Android 中当前运行的 Activity 任务栈信息 二.Activity 任务栈信息分析 三.Activity 在相同 Stack 的不同 Task 情况 一.打印 And ...

  2. 【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 )

    文章目录 一.Activity 启动源码分析 ( AMS | ActivityManagerService ) 1.Instrumentation 调用 AMS 方法 2.ActivityStarte ...

  3. Linux内核--网络栈实现分析(二)--数据包的传递过程--转

    转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的&qu ...

  4. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )

    文章目录 前言 一.ActivityManagerService.attachApplicationLocked 二.ActivityStackSupervisor.attachApplication ...

  5. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 二 )

    文章目录 前言 一.ActivityThread 类 handleLaunchActivity -> performLaunchActivity 方法 二.Instrumentation.new ...

  6. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 一 )

    文章目录 前言 一.ClientTransactionHandler.scheduleTransaction 二.ActivityThread.H 处理 EXECUTE_TRANSACTION 消息 ...

  7. 【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 二 )

    文章目录 前言 一.热启动与冷启动选择 二.AMS 进程中执行的相关操作 三.通过 Binder 机制转到 ActivityThread 中执行的操作 总结 前言 上一篇博客 [Android 启动过 ...

  8. 【Android 启动过程】Activity 启动源码分析 ( Activity -> AMS、主线程阶段 )

    文章目录 一.Activity 启动源码分析 ( Activity -> AMS 阶段 ) 一.Activity 启动源码分析 ( Activity -> AMS 阶段 ) 调用 star ...

  9. 如何获取当前C#程序所有线程的调用栈信息 ?

    咨询区 Daniel Sperry 请问如何获取 .NET 程序当前所有线程的调用栈信息?我知道在 java 中只需调用 java.lang.Thread.getAllStackTraces() 方法 ...

最新文章

  1. zentao这php,ZenTaoPHP后面计划
  2. matplotlib的下载和安装方法
  3. php网站商品图片上传代码,PHP实现图片上传代码
  4. Vue:文章新闻界面,点击上一篇下一篇界面不重新加载解决方案
  5. jQuery:实现排他
  6. Vue开发环境的搭建
  7. 大二 数据结构 期末复习题(仅供参考)
  8. 14种最佳的PHP帮助台脚本和5种免费选项
  9. 小米蓝牙耳机持续白灯_小米蓝牙耳机不能自动串联问题
  10. 快递柜储物柜锁控制板
  11. iqos烟弹哪个最好抽?我品尝了十一种电子烟烟弹后告诉你
  12. html单标签和双标签汇总
  13. 深入理解Spring----PostConstruct和PreDestroy
  14. zcmu--1931: wjw的剪纸(dfs+枚举)
  15. pba mode ( path based analysis for sta )
  16. 谷歌浏览器登录不了账号_腾讯qq无故冻结账号什么情况?qq号为什么登录不了方法官方回应_海峡网...
  17. 为什么选择软件测试这个岗位?(面经)
  18. 业界 | 为什么Jupyter是数据科学家们实战工具的首选?
  19. svn提交代码报错:svn: E175002: Unexpected HTTP status 502 ‘Bad Gateway‘
  20. C++ QT加载字体,以及iconfont使用

热门文章

  1. Spring Cloud【Finchley】-01服务提供者与服务消费者
  2. mysql中数据类型总结_mysql数据类型总结
  3. 数据结构:循环链表解决约瑟夫问题
  4. oracle主键增长方式,oracle 自增长主键
  5. Redis与其他缓存框架的对比
  6. mysql 函数依赖关系_MySQL关系规范化
  7. python获取用户输入的数字_Python 将用户输入的数字 提取整数谢谢
  8. linux如何扩展根分区,linux扩展根分区详细步骤
  9. java单态模式_Java单态模式
  10. mysql同步row模式_ROW模式的SQL无法正常同步的问题总结