Activity任务栈
通常每个APP都有一个Activity任务栈,app中所有的Activity都存在该任务栈中,栈顶的Activity为当前正在显示的Activity。当点击Icon启动App时,会先判断当前App的任务栈是否已经存在,如果已经存在则这接把任务栈调出来显示,不存在则创建任务栈,然后将应用的Activity入口打开。
启动模式
Standard
标准模式,每次启动Activity都会创建新的Activity实例,并将该Activity放到任务栈的栈顶。
SingleTop
栈顶Activity复用,例如自己启动自己,此时不会重新创建新的Activity,直接回调onNewIntent将intent传进来。
SingleTask
栈内复用,当前Activity在当前任务栈中只有一个实例。
例如: 任务栈中顺序为: A–>B–>C–>D D如果启动A时,B和C会从Activity中移除。
SingleInstance
总是在新的任务中开启,任务栈中只有一个实例,,再次启动Activity时会调用onNewIntent
taskAffinity
SingleTop和Standard启动模式下,启动Activity时设置taskAffinity属性无效,activity默认放到启动它的Activity的任务栈中。
清单文件中activity声明时加入taskAffinity属性,可以指定当前Activity存储的任务栈,没写默认是当前的包名。当Activity模式为SingltTop和Standard时,taskAffinity属性无效,不会重新创建任务栈???这里没理解。
例如:
A-->B(SingleTask)-->C(Standard) B设置了taskAffinity属性,定义了自己的任务栈,那么C存在B的任务栈中。
A-->B(SingleInstance)-->C(Standard) B为singleInstance模式,singleInstance栈中只有一个实例,此时C存在于A的任务栈中。
A-->B(SingleInstance)-->C(Standard) B为singleInstance模式,singleInstance栈中只有一个实例,此时C如果定义了taskAffinity属性会重新创建任务栈。
任务栈是系统层面的,两个Activity可以通过设置相同的taskAffinity属性来使用同一个任务栈。
使用场景
SingleTask 适合App的入口。
SingleInstance应用层开发较少用,使用与需要和应用分离的页面,例如闹钟等等。
SingleTop:适用于推送点开的页面,微信聊天,新闻页面等等。SingleTop在重用时不会再次调用onCreate只会回调onNewIntent方法。