Activity启动模式
2016-05-26 01:37
190 查看
两种方式可以定义Activity启动模式:
- Manifest
- Intent
Intent定义的启动模式优先于Manifest
如果该Activity处于当前任务栈的顶部,系统会调用它的onNewIntent()方法,而不是创建一个新的实例。该Activity可以被实例化多次,每个实例可以属于不同的任务,而且一个任务可以拥有多个该Activity的实例。
系统会创建一个新的任务(可能会创建,也可能不创建,有条件)。然而,如果该Activity实例已经存在于一个别的任务中,系统会调用它的onNewIntent()方法。同一时间只有一个实例。
系统不会在持有该Activity实例的任务中启动其他Activity,除此之外,其他都与
不管Activity运行在一个新的任务还是与启动它的Activity同样的任务,返回键总是把用户带到之前的Activity。然而,如果启动一个
与
与
如果已经该Activity已经在当前任务中运行,会清掉位于该Activity顶部的所有Activity,然后调用其onNewIntent()方法。如果该Activity为
两种情况需要该属性。
- 启动一个
设置为
- Activity的
这种情况下,Activity能从启动时所属的任务A中移动到与该Activity的affinity相同的任务B中,当任务B来到前台时。
注意,如果不是这两种情况,那么该属性的设置是无用的。
-
如果在一个任务的根activity把该属性设置为true,那么刚才说到的默认行为就不会发生。
-
如果在一个任务的根Activity把该属性设置为true,无论用户什么时候离开,都会发生上面的行为。
-
该属性类似于
参考
Android官方文档
Activity singleTask之谜
- 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之谜
相关文章推荐
- HashMap深度解析(一)
- webapi+entityframework分享
- jQuery基础(一)
- Struts2的convention插件,在步骤中使用Action注解跳转到其他jsp页面
- LeetCode 145. Binary Tree Postorder Traversal(二叉树后序遍历)
- 关于在写5-3路上的一点趣事
- SVG path绘制百分比圆弧,给力啊
- windows下编译java源文件的编码错误
- VMware中linux访问共享文件夹设置流程
- TortoiseSVN与VisualSVN Server搭建SVN版本控制系统【转】
- 理解几个概念
- 9.2容器库概览
- LeetCode 146. LRU Cache(LRU缓存)
- cocos2dx笔试题
- 关于Fragment.onCreate()中引用Activity.onCreate()创建的对象时的一个异常
- hdu 3874 线段树 离线查询
- Java序列化与反序列化
- LeetCode 147. Insertion Sort List(插入有序链表)
- HDOJ/HDU 1073 Online Judge(字符串处理~)
- HDOJ/HDU 1073 Online Judge(字符串处理~)