任务栈,Activity的启动模式和运用场景

   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将不存在了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值