Activity启动模式&任务栈

Activity启动模式设置: 


        <activity android:name=".MainActivity" android:launchMode="standard" /> 


Activity的四种启动模式: 


     1. standard  


        模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。 


     2. singleTop  


        如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。 


     3. singleTask  


        如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。  


     4. singleInstance  


        在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦该模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。

http://my.oschina.net/u/1246663/blog/202272 


附任务栈:

From Google官网:理解可能有错,希望被指出,谢谢啦!!

一个任务对应一个栈,栈中可能存在多个Activity

正常不做任何设置,你的Activity跳转应该是下图所示:

对于此图,从头到尾只有一个任务和栈

 

相同的Activity默认是会再创建一个实例,而不是复用,如下图的HomeActivity(创建了2个实例)

通常有2种方式设置Activity的启动模式:

1.在AndroidMainfest <Activity>标签中加入属性launchMode:

1.standard(默认就是这个)

2.singleTop 讨论这个前提是在一个任务中的,假设我的activity b启动模式是singleTop的,如果出现类似于a-b 然后我再启动b的时候将仍然是a-b而不是a-b-b,如果是b-a,我再启动b时,则会是b-a-b.(还是创建了一个)

3.singleTask 假设我有个activity b是singleTask模式,首先如果分离的任务中不存在b,那么将建立一个新任务,然后将b作为该任务的根,也就是在该任务的栈底,反之如果有一任务栈中已经存在b,b所在任务栈中之前的activities都将被清掉,之后的全部被带进来.

此图所没涉及到的是:假如image位置倒一下,X在上Y在下,那么当2启动Y时候,X会被清掉。

4.singleInstance 除了包含singleTask一些性质外,singleInstance还有一个重要的特点,就是它所处的任务栈中只有它一个实例。

2.设置Intent的Flag,主要有3种Flag

1.FLAG_ACTIVITY_NEW_TASK 这个作用与singleTask模式一样。

2.FLAG_ACTIVITY_SINGLE_TOP 这个作用与singleTop模式一样。

3.FLAG_ACTIVITY_CLEAR_TOP 讨论这个前提是在一个任务栈中的,假设B是以这个标志启动的,比如A-B-C-D 我在启动B最后结果将是A-B,C-D会被清掉。

 

关于任务的栈:

当你的任务栈被置于后台的时候,过了一定量的时间,系统会把你这个任务栈中的Activities清得只剩下根Activity,因为它认为用户已经“遗弃了”。

当然你可以修改这种默认行为,通过在<Activity>标签里加入属性:

1.alwaysRetainTaskState 这个属性加入到你根Activity上,即便你的任务在后台,系统也尽量保存你整个任务状态,当然我们这里不讨论资源紧张的时这种特殊情况。

2.clearTaskOnLaunch 这个属性加入到你根Activity上,效果于前面的相反,Task将被清光,即便离开只是一小会。

3.finishOnTaskLaunch 这个属性跟上一个类似,不过他针对是单个Activity.(没试过)

 

总结:

singleTask和singleInstance都会创建一个新的Task,我们使用应该只用在启动的activity有一个action Main和category launcher的时候,也就是启动另外一个程序的时候。

之所以这么说是因为,假设一个任务栈A-B 然后B启动C的时候使用singleTask,C就处于一个新的任务栈中,当用户在C上操作了好长一段时间,你的A-B这个任务栈可能会被系统回收掉,那时候你再按HOME键,就会丢失了C,因为C不代表这个APP。(这个是我的理解,可能有错)。

鉴于此,如果你要使用的话,比如像C这种情况,既然我找不到了,那我就不希望它还活着,就可以在C activity标签里加入finishOnTaskLaunch.

http://my.oschina.net/wangjunhe/blog/97552
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值