task stack
任务栈 : 1.一个应用程序都是由很多的activity 组成的。
2.任务栈就是来存放用户开启的activity的。
3.一个应用程序一旦开启系统就会给他开启独立的一个任务栈,当所有的activty 都销毁的时候,任务栈就清空了。
4.任务栈的id是integer类型的,自增长的。
5.任务栈的标记唯一性是通过他的taskafiinity属性(亲和力,依附性)
为什么同一个应用开启的activity 会在同一个task stack中呢?他们回到其他的任务栈里面去吗?如果转到其他的任务栈,他们回到什么样的任务栈呢?
每一个activity都有他的taskffinity属性,这个属性指出了他要进入的任务栈,如果一个activity没有明确的指出他的taskaffinity那么他的属性就等于application指明的任务 taskaffinity ,如果application也没有指明,那么该 taskaffinity的值就等于他的包名。而task 也有自己的affinity 属性,它的值等于他的根activty的taskaffinity属性。
大部分的 的activity都在创建他的task stack 中,并且大部分都在这里度过了他们的生命周期,然而有一些情况,他们会被分配到别的任务栈中去
第一种情况 , 如果一个activity的allowtaskreparenting 属性为 true 的时候,它进入到后台,当一个和它有相同的属性的taskaffinity的task 进入到前台的时候,它就会重新宿主 进入到该前台的task stack 中。
当一个 activity是singletask模式的时候,首先该activty会检查是否存在和它有相同的taskaffinity的任务栈,1.如果存在,那么检查是否实例化,如果已经实例化,那么就会销毁在 activity之上的activity 并且调用onNewIntent,如果没有实例化,那么将该activity 实例化并入栈。2,如果不存在,那么就重新创建task ,并入栈。
activity 的四种启动模式以及运用场景
activity的启动模式的设置有两种方式:一种是在清单文件中配置,还有一中是在代码中intent中设置flag
standard: 标准模式 适用于大部分的activity,打卡一个activity 就新建一个activity的实例放入任务栈中。
singleTop:如果栈顶有的话,就不会在创建实例而是直接调用onnewIntent 的方法,否则创建实例放到栈顶。
使用场景:适合于接受通知之后启动一个页面的场景,比如接受到一条消息的通知,打开聊天的页面(项目里的,聊天的页面也用到)。例如一个新闻客户端,弹出十几条消息,如果不使用 singletop 的模式会打卡很多个页面。
singletask:栈内复用的模式。首先该activty会检查是否存在和它有相同的taskaffinity的任务栈,1.如果存在,那么检查是否实例化,如果已经实例化,那么就会销毁在 activity之上的activity 并且调用onNewIntent,如果没有实例化,那么将该activity 实例化并入栈。2,如果不存在,那么就重新创建task ,并入栈。
一般程序的主页面是singleTask模式(项目里的OAActivity 是该模式),浏览器页面
singleinstance: 一个activity 独占独立运行在它的一个单独的任务栈,任何从该activity启动的activity 都会被放入到其他的任务栈。单一的实例模式,整个手机系统中只有一个这样的实例,不同的应用去打开它,共用一个activity ,例如呼叫来电的界面。
Activity的主要属性:
allowTaskReparenting:设置成true时,和Intent的FLAG_ACTIVITY_NEW_TASK 标记类似。
alwaysRetainTaskStat: 如果用户长时间将某个task 移入后台,则系统会将该task的栈内容弹出只剩下栈底的activity,此时用户再返回,则只能看到根activity了。如果栈底的 activity的这个属性设置成true,则将阻止这一行为,从而保留所有的栈内容。
clearTaskOnLaunch:根activity的这个属性设置成true时,和上面的alwaysRetainTaskStat 的属性为true情况搞好相反。
finishOnTaskLaunch:对于任何activity,如果它的这个属性设置成true,则当task被放置到后台,然后重新启动后,该activity将不存在了。