Activity调用栈的分析

425 阅读3分钟

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

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

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出一个新的实例。如下图:
    standard
  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时才能对原任务栈进行操作(如下图)。
    Paste_Image.png
  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,不接受任何销毁命令)

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