主要的Activity属性有: 1、launchMode 2、taskAffinity 3、allowTaskReparenting 4、clearTaskOnLaunch 5、alwaysRetainTaskState 6、finishOnTaskLaunch 详细介绍可以参看Google文档,Tasks and Back Stack
个人理解
1>Activity launchMode设置不为standard,在跳转Activity时,如果新的Activity不再创建新的实例(不执行onCreate) 会调用onNewIntent方法。 (正常生命周期情况不会调用onNewIntent())
2>Activity launchMode singleInstance实用场景—>关于浏览器的LaunchMode为singleTask,所以如果当你点击一个连接下载文件时(由一个activity来处理下载,launchmode为standard),如果再次进入浏览器,那么下载页面就被Destory了,那么这里我们可以把下载页面LaunchMode设置为singleInstance可以解决这个问题.(即:在使用singleTask的情况下 不想关闭的界面可单独新起一个task)
3>taskAffinty对lanuchMode的影响 :
当LanuchMode设置为 standard 和singTop,即使 taskAffinty不同,也不会新起Task.
当LanuchMode设置为 singleTask ,以A启动B来说
1、当A和B的taskAffinity相同时:第一次创建B的实例时,并不会启动新的task,而是直接将B添加到A所在的task;当B的实例已经存在时,将B所在task中位于B之上的全部Activity都删除,B就成为栈顶元素,实现跳转到B的功能。 2、当A和B的taskAffinity不同时:第一次创建B的实例时,会启动新的task,然后将B添加到新建的task中;当B的实例引进存在,将B所在task中位于B之上的全部Activity都删除,B就成为栈顶元素(也是root Activity),实现跳转到B的功能。
当LanuchMode设置为singleInstance
当第一次创建该Activity实例时,会新建一个task,并将该Activity添加到该task中。注意:该task只能容纳该Activity实例,不会再添加其他的Activity实例!如果该Activity实例已经存在于某个task,则直接跳转到该task。
4>allowTaskReparenting 这个属性用来标记一个Activity实例在当前应用退居后台后,是否能从启动它的那个task移动到有共同affinity的task,“true”表示可以移动,“false”表示它必须呆在当前应用的task中,默认值为false。
5>clearTaskOnLaunch
程序回到home界面后,再次点击程序图标的效果。影响的是activity的生命周期。
简单的:
activity A(clearTaskOnLaunch设置为true)(为主界面)
activity B
程序启动A,在启动B。再点击HOME键回到桌面,再点击程序图标,效果是B执行onrestart,B执行ondestory。A界面显示。(如果clearTaskOnLaunch没设置,则是显示B界面)
稍微复杂点的:
activity A(clearTaskOnLaunch设置为true),B(clearTaskOnLaunch设置为true),C
依次启动A,B,C,点击HOME,再在桌面点击图标。启动的是A(执行onrestart),B、C执行(ondestory)。
也就是说,优先启动第一个(A)已注册clearTaskOnLaunch为true的Activity,其余的后启动的activity(B、C)都销毁,除非前面A已经finish销毁,后面的已注册clearTaskOnLaunch为true的activity才会生效。