在manifest.xml文件中,我们可以为Activity指定launchMode,总共有四种,弄清楚这四种的区别在Android开发中还是非常有必要的,下面分别来讨论:
1. standard,这种是默认的模式,Activity可以创建很多的实例,不管这些实例是不是在同一个任务中。可以简单理解只要调用startActivity就会创建一个新的实例。
2.singleTop,基本同standard相同,唯一的区别就是如果当前有这个Activity的实例在当前任务栈的最上面,就不会再创建新的实例了,而是会调用其onNewIntent方法。例如当然任务栈中几个Activity: A-B-C-D, D是最上面的也就是当前显示的Activity,现在有个Intent要启动D,如果D是standard模式,启动后的任务栈就是A-B-C-D-D,如果是singleTop模式,启动后的任务栈就是A-B-C-D,并且D的onNewIntent方法会被调用。
3.singleTask, 只会有一个实例,如果还没有实例,就会创建一个新的任务栈,并且创建一个实例放到这个栈中;如果已经有实例了只会调用其onNewIntent方法。
4.singleInstance, 基本同singleTask一样,区别就是任务栈中只会并且仅能有这样一个实例。如果在这个实例中启动其他的Activity,都会创建一个新的任务。
另外在StartActivity的时候,还可以在Intent中指定Flag, 这些Flag有:
1.FLAG_ACTIVITY_NEW_TASK, 同singleTask.
2.FLAG_ACTIVITY_SINGLE_TOP, 同singleTop.
3.FLAG_ACTIVITY_CLEAR_TOP, 如果Activity已经启动并且在任务栈中了,就会将其上面的所有Activity销毁,将这个Activity置于最上面,也会调用onNewInent方法.
如果launchMode和Flag冲突怎么办?Flag有优先权。
参考文献:http://developer.android.com/guide/components/tasks-and-back-stack.html
如果有ABCD四个Activity,AB是singleInstance,CD是standard,按照A-C-B-D的顺序启动,然后依次按back键,后退的顺序是什么呢?答案是D-C-B-A。为什么会这样呢?我们再来看一下singleInstance的说明,其任务栈中只有并且仅有一个实例,所以启动A创建一个任务栈,启动C就会创建一个新的任务栈,再启动B又创建了一个新的任务栈,再启动D就不会创建新的任务栈了,而是压入到C的上面。所以总共会有三个任务栈,退出的顺序也会如上所说那样。如果启动顺序为A-C-B-D-A,后退的顺序会是什么呢?答案是A-D-C-B,原理同上面一样。
如果AB是singleTask,按照A-C-B-D的顺序启动,然后依次按back键,后退的顺序是 D-B-C-A.如果启动顺序为A-C-B-D-A会出现什么情况呢?结果是只有A还活着,其它的都会被杀死。
阅读(4846) | 评论(1) | 转发(1) |