Android多任务切换与Activity启动模式SingleTask之间关系的分析


这里会以多个场景列子进行分析,在分析之前先了解一下基本的概念。

? ? ? ?Task任务:一系列Activity的集合,这些Activity以栈的形式进行排列(后进先出)。

? ? ? ?那在什么时候系统会新建一个Task任务呢?

? ? ? ?这个要以app来区分,当一个app以singleTask启动方式启动另外一个app的activity时,会新建一个Task任务,而第二个app的Activity会成为这个栈中的根。

? ? ? ?反之,在什么时候不会创建新任务呢?当一个app以非SingleTask方式启动另一个app时,或者在同一app内无论以什么方式启动其他Activity,都不会创建新的任务。

? ? ? ?上面的说法会在之后的场景中一一进行验证。

? ? ? ?长按HOME键后,在最近打开的任务中可以看见新创建的Task。

?

? ? ? 各个应用程序都是由launch启动的,首先来分析launch这个Activity。launch是由系统启动(由ActivityManangerService启动),当launch启动后,相当于启动一个Task,简称Task1,launch这个Activity成为Task1维护的栈中的根元素。这里,当在launch中点击app1启动图标不会在Task1中继续添加,而是会为app1新建一个Task任务,原因如下

 boolean startActivitySafely(Intent intent, Object <span id="4_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="4_nwl" style="text-decoration: none;" href="http://cpro.baidu.com/cpro/ui/uijs.php?c=news&cf=1001&ch=0&di=128&fv=17&jk=e303aa527b7f723e&k=tag&k0=tag&kdi0=0&luki=1&n=10&p=baidu&q=72008038_cpr&rb=0&rs=1&seller_id=1&sid=3e727f7b52aa03e3&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1893960&u=http%3A%2F%2Fwww%2Echengxuyuans%2Ecom%2FAndroid%2F67414%2Ehtml&urlid=0" target="_blank" mpid="4"><span style="width: auto; height: auto; color: rgb(0, 0, 255); font-size: 12px; float: none;">tag</span></a></span>) {
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        try {
            startActivity(intent);
            return true;
        } catch (ActivityNotFoundException e) {}
}

? ? ? ? ?

? ? ? ?launch启动其他Activity都是以new task的方式启动的。这样每启动一个app,都会新建一个任务(如果任务不存在)。这样多个任务就产生了,点击HOME键的时候会启动Launch,相当于把Launch这个任务从后台移动到前台,这个时候继续点击app1,也就相当于把app1(前提app1的第一个activity在配置文件中的启动模式声明不是aingleTask)所在的任务移动到前台显示,而不会重新排布app1中所有Activity的位置。

?

模拟一下两个Task的场景

? ? ? ? 场景1. 从Task1中的launch中打开app1,会新建Task2,Task2的根为Activity_a,启动模式为默认,从Activity_a中打开Activity_b.,然后从Activity_b中点击HOME回到Launch,再点击app1,这个时候相当于直接把Task2从后台移动到前台,Task1处于后台,Task2维护栈中的Activity位置不变,Activity_b依然处于栈顶,显示在最前端。

?

? ? ? ? ?场景2.?从Task1中的launch中打开app1,会新建Task2,Task2的根为Activity_a,启动模式为SingleTask,从Activity_a中打开Activity_b.,然后从Activity_b中点击HOME回到Launch,再点击app1,这个动作会先判断Task2的根Activity是否是SIngleTask,如果是,则执行Activity_a的onNewIntent()方法,destory掉Activity_b。如果不是直接把Task2移动到前台显示。

?

(注意:场景2如果不是从launch中点击图标进入,而是从显示的最近任务中进入,则不会判断根Activity的启动模式,会直接把Task2移动到前台。Task2中的Activity排列方式不变)

?

?

模拟一下3个Task的场景

? ? ? ?条件:Task1中一个Launch, Task2中app1含Activity_a,Activity_b , Task3中app2含Activity_D,Activity_E,Activity_F。

? ? ? ?场景1:从launch中进入Activity_a,然后进入到Activity_b,在Activity_b中以普通模式打开Activity_e(可以通过隐式启动打开),然后在Activity_E中打开Activity_F,虽然从Task2中打开了另一个app的Activity,但是由于是默认模式打开的,所以不会创建新任务Task3,Activity_E和Activity_F都属于Task2,,这时候点击Home键回到Launch,再点击app1,会把Task2移动到前台,显示出处于Task2最顶端的Activity_F,最近显示的任务中也不会出现Task3.

?

? ? ? ?场景2:从launch中进入Activity_a,然后进入到Activity_b,在Activity_b中以SingleTask模式打开Activity_e,然后在Activity_E中打开Activity_F,这个时候由于符合新建Task条件,不同app,singleTask启动,会新建Task3,然后在Activity_E中打开Activity_F,然后按home键进入到launch,发现最近任务中出现了task2,和task3,这时候点击app1发现Activity_b处于最顶端,点击app2发现该Task3已经存在,不会继续创建,显示Activity_F处于顶端,从Activity_F中点击返回键,依次回到Activity_E,最后launch,而不会回到Activity_D,因为Activity_D不在栈中。

?

?

?总结一下,

? ? ? ?1:要创建新任务,至少要满足两个条件:不同app和以SingleTask方式启动,否则在同一个app中以SingleTask方式打开Activity是不会新创建任务的。

? ? ? ?2.在最近任务中进行多个任务之间的相互切换时不会打乱每个任务中Activity的排列。但是在点击app图标进行多个任务切换时,系统会先判断该任务根Activity的启动模式是否为SingleTask,不是的话,不做任何操作,如果是的话,执行根Activity的onNewIntent方法,把覆盖在根Activity之上的Activity destory掉。

? ? ? ?3.当没有创建新任务时,新打开的Activity会一直进行当前任务中进栈,无论这些个Activity是属于哪一个App。

?

?

?

转载注明地址:http://www.chengxuyuans.com/Android/67414.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值