您的位置:首页 > 其它

Activity启动模式

2016-05-26 01:37 190 查看
两种方式可以定义Activity启动模式:

- Manifest

- Intent

Intent定义的启动模式优先于Manifest

Manifest定义的启动模式

"standard"
(默认)

"singleTop"


如果该Activity处于当前任务栈的顶部,系统会调用它的onNewIntent()方法,而不是创建一个新的实例。该Activity可以被实例化多次,每个实例可以属于不同的任务,而且一个任务可以拥有多个该Activity的实例。

"singleTask"


系统会创建一个新的任务(可能会创建,也可能不创建,有条件)。然而,如果该Activity实例已经存在于一个别的任务中,系统会调用它的onNewIntent()方法。同一时间只有一个实例。

"singleInstance"


系统不会在持有该Activity实例的任务中启动其他Activity,除此之外,其他都与
singleTask
相同。该Activity总是它所属任务的唯一成员,它启动的其他Activity都在其他任务中。

不管Activity运行在一个新的任务还是与启动它的Activity同样的任务,返回键总是把用户带到之前的Activity。然而,如果启动一个
singleTask
的Activity,而且该Activity处于一个后台任务中,那么整个任务都会被带到前台,此时,回退栈会包含该任务的所有Activity。



Intent定义的启动模式

FLAG_ACTIVITY_NEW_TASK


"singleTask"
相同。

FLAG_ACTIVITY_SINGLE_TOP


"singleTop"
相同。

FLAG_ACTIVITY_CLEAR_TOP


如果已经该Activity已经在当前任务中运行,会清掉位于该Activity顶部的所有Activity,然后调用其onNewIntent()方法。如果该Activity为
"standard"
,那么包括该Activity也会被清掉,然后新建一个该Activity的实例,因为
"standard"
模式的Activity总是会新建一个实例。

Affinity

相同affinity的Activity运行在相同任务中 ,可以通过
"taskAffinity"
设置。

两种情况需要该属性。

- 启动一个
FLAG_ACTIVITY_NEW_TASK
的Activity时。

设置为
FLAG_ACTIVITY_NEW_TASK
的Activity可以在一个新的任务中启动,但并非必然。如果找到了一个与被启动Activity相同affinity的任务,系统会把该activity加入此任务中,否则,才会开启一个新的任务。(默认情况下,一个应用的所有activity拥有相同的affinity,所以都运行在同一个任务中。)

- Activity的
allowTaskReparenting
属性设置为true时。

这种情况下,Activity能从启动时所属的任务A中移动到与该Activity的affinity相同的任务B中,当任务B来到前台时。

注意,如果不是这两种情况,那么该属性的设置是无用的

清空回退栈

如果用户长时间离开一个任务,系统会清掉这个任务除了根activity以外的其他activity。当用户重新返回这个任务时,只有根Activity被重建。有一些属性可以修改这个行为:

-
"alwaysRetainTaskState"


如果在一个任务的根activity把该属性设置为true,那么刚才说到的默认行为就不会发生。

-
"clearTaskOnLaunch"


如果在一个任务的根Activity把该属性设置为true,无论用户什么时候离开,都会发生上面的行为。

-
"finishOnTaskLaunch"


该属性类似于
"clearTaskOnLaunch"
,但是它只操作单一的Activity,而不是一整个任务。如果某个activity的该属性为true,那么用户任何时候离开后再返回这个任务,都会清掉这个activity

参考

Android官方文档

Activity singleTask之谜
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: