生活本来就不容易啊,而我们的不努力只会让生活变得更加无赖。
今天看了《Android群英传》的有关Activity调用栈的相关知识,所以得来写点东西记录今天的收获。
- 回想当初学习《第一行代码》的时候也看到过这图,号称开始那几年Android面试必问的知识点,所以po上来表示膜拜。下面入正题:
Android的调用栈
Android是利用数据结构中的栈来管理Activity的,利用栈是因为它的后进先出(Last In First Out)特性可以在正常情况下良好的管理和决定Activity的状态。
比如当一个ActivityA启动另一个ActivityB时,ActivityB处于活动状态,而ActivityA被压在栈底,处于停止状态。当用户按下Back键或者调用finish()方法后,ActivityA重新处于活动状态进行交互这么一种“和谐”的状态。但是,并不是所有的Activity都这么“和谐”。所以Google提供了几种“特权”让Activity有权力!赋予Activity的权力可以通过AndoridMainifest
的android:launchMode
属性或者直接通过Intent
两种方式。
AndroidMainifest启动模式
- standard
- singleTop
- singleTask
- singleInstance
-
standard
Activity默认的启动模式,每次创建Activity都会new出一个新的实例。如下图:
- singleTop
- 系统会判断栈顶Activity是否为所需Activity,是则直接引用,否则新建。(QQ接收信息时,如果在此界面接收到多条信息,直接引用而非new多次实例)
- 栈顶ActivityA接收请求需启动ActivityA,则只会调用其onNewIntent()方法。
- singleTask
- 这种模式与singleTop类似,但此模式是查找整个Activity栈(同一任务栈)是否存在所需Activity,存在则将其后压栈的Activity全部销毁致使目标Activity位于栈顶(可以利用这种模式,用来退出整个应用。将主Activity设置为singleTask模式,在需要退出的Activity跳转到主Activity,将任务栈清空,利用主Activity中的onNewIntent()方法中调用finish()即退出)。
-
当处于不同任务栈的Activity被启动时,将把其整个任务栈引入,当按下back键时,需退出这个任务栈所有Activity时才能对原任务栈进行操作(如下图)。
- singleInstance
书上说这种模式,会新建一个任务栈。其原理与浏览器的工作原理相类似。多个程序访问浏览器时。如果浏览器已开则直接访问,没有则打开浏览器后访问。
singleTop与singleInstance还有一点需注意:如果ActivityA中调用startActivityForResult()启动另外一个时,系统会自动返回Activity.RESULT_CACELED而不会再等待返回。
Intent Flag启动模式
- Intent.FLAG_ACTIVITY_SINGLE_TOP(singleTop效果相同)
- Intent.FLAG_ACTIVITY_CLEAR_TOP(singleTask效果相同)
- Intent.FLAG_ACTIVITY_NO_HISTORY(该模式下,ActivityA启动ActivityB后,ActivityA小时)
清空任务栈
- clearTaskOnLaunch(每次返回该Activity时,其Activity上的Activity全部销毁)
- finishOnTaskLaunch(离开所在的Activity栈,后返回此Activity被finifh()掉)
- alwaysRetainTaskState (“免死金牌”,当Activity的此属性设置为true,不接受任何销毁命令)
总结:其实网上这些文章有很多而且写的很透彻,例如老罗的啊,但是自己写下来感觉会不一样。