Android的启动模式
来源:互联网 发布:新浪网络传真 编辑:程序博客网 时间:2024/06/12 01:09
转自:http://www.2cto.com/kf/201403/284469.html
在一个Android应用中,不可避免的会包含多个Activity,当开启多个Activity之后,当按后退键时,一般会回退到上一个Activity,这一点和浏览器有点类似,但是需要注意的是Android系统只能回退到上一个Activity,没办法前进到下一个Activity,维护这个功能就需要了解到一个回退栈(Back Stack)的概念。
什么是回退栈?
首先先来了解一下应用程序与进程的关系,众所周知,Android下有四大组件:Activity、Service、Receiver、ContentProvider。一般开发一个应用程序,会包含多个Android组件,所以应用程序是一组组件的集合,而进程则是运行这些组件的载体。
而回退栈(Back Stack)只是针对Activity而言的,它是用来维护用的界面体验的,使一个Task让用户感觉就是一个应用,而无论其中的Activity是否来自同一个应用程序,所以不要把回退栈和进程弄混了。设备的Home页面是大多数Task的起始位置,当用户点击一个应用程序图标的时候,应用的Task就会来到前台,并把应用的主Activity压入BackStack的栈顶,并获得焦点,这个Activity称为根Activity,而在BackStack中的Activity可以通过点击回退键弹出栈并销毁,这时就会使上一个Activity获得焦点,直到用户返回到Home页,而当BackStack中的Activity都被弹出销毁之后,这个Task就不复存在了,但是这个程序的进程还存在(不在此时销毁)。
Task的状态
就像上面介绍的,每个Task都存在一个BackStack,而系统中可以存在多个Task,但是每次只有一个Task获得前台焦点,一般而言,系统允许用户在多个Task中切换,而被至于后台的Task中的Activity,将被置于Stopped状态。实际上,同一个Task中的Activity,只要不存在于栈顶并且获得前台焦点的Activity,那么它就是一个Stopped的状态。下
Activity的启动模式
根据Activity的不同的启动模式,它在BackStack中的状态是不一样的。Activity可以通过AndroidManifest.xml清单文件配置,在节点中的android:launchMode属性设置。它有四个选项:
· standard
· singleTop
· singleTask
· singleInstance
standard:
标准启动模式,也是默认启动模式,如果不设置android:launchMode属性的话。standard模式下的Activity会依照启动的顺序压入BackStack中。
下图是standard模式下,Activity的压栈和回退操作示意图:
singleTop:
单顶模式,这种Activity启动模式,启动一个Activity的时候如果发现BackStack的栈顶已经存在这个Activity了,就不会去重新创建新的Activity,而是复用这个栈顶已经存在的Activity,避免同一个Activity被重复开启。
下图是singleTZ喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcMSjyr3PwqOsQWN0aXZpdHm1xNG51bu6zbvYzcuy2df3yr7S4s28o7o8L3A+CjxwPjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20140310/20140310140210338.jpg" alt="\">
singleTask:
开启一个Activity的时候,检查BackStack里面是否有这个Activity的实例存在,如果存在的话,结束BackStack里这个Activity上所有的其他Activity。
下图是singleTask模式下,Activity的压栈和回退操作示意图:
singleInstance:
被标记为singleInstance启动模式的Activity,在启动的时候,会开启一个新的BackStack,这个BackStack里只有一个Activity的实例存在,并且把这个BackStack获得焦点。这是一种很极端的模式,它会导致整个设备的操作系统里,只会存在一个这个Activity示例,无论是从何处被启动的。
下图是singleInstance模式下,Activity的压栈和回退操作示意图:
<img src="http://www.2cto.com.c4.open.360cdn.cn/uploadfile/Collfiles/20140310/20140310140219342.jpg" alt="n块�)鄷�'仓妗" http:="" www.2cto.com="" kf="" yidong="" android="" "="" target="_blank" class="keylink" data-am-src="http://www.2cto.com/uploadfile/Collfiles/20140310/20140310140219342.jpg" style="border-width: 0px; padding: 0px; margin: 0px; list-style: none; width: 630px; height: 254.665924276169px;">Android系统的来电页面,多次来电均使用的是一个Activity。
当然,在Android中,除了在AndroidManifest.xml清单文件中配置LauncherMode属性外,还可以在代码中设置启动模式。在组件中,启动一个Activity,需要用到startActivity()方法,其中传递一个Intent,可以使用Intent.setFlags(int flags)来设置新启动的Activity的启动模式,而通过代码设置Activity的启动模式的方式,优先级要高于在AndroidManifest.xml清单文件中的配置。
Intent.setFlag(int flags)方法传递的一个整形的数据,被Android系统设置为了常量:
· FLAG_ACTIVITY_NEW_TASK:这个标识会使新启动的Activity独立创建一个Task。
· FLAG_ACTIVITY_CLEAR_TOP:这个标识会使新启动的Activity检查是否存在于Task中,如果存在则清除其之上的Activity,使它获得焦点,并不重新实例化一个Activity,一般结合FLAG_ACTIVITY_NEW_TASK一起使用。
· FLAG_ACTIVITY_SINGLE_TOP:等同于在LauncherMode属性设置为singleTop。
总结:
standard 每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)
singleTop 当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。 如不在栈顶,则新建实例 (每个Task都可以有,且可以有多个,在栈顶时可复用,否则创建)
singleTask 新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)
singleInstance 新建一个Task,且在该Task中只有它的唯一一个实例。 (只有一个Task会有,且该Task中只有它)
- Android的启动模式
- android的启动模式
- Android的启动模式
- Android 的启动模式
- Android的启动模式
- Android的启动模式
- android的启动模式
- Android的启动模式
- Android的启动模式
- android activity 的启动模式
- android activity的启动模式
- android activity的启动模式
- Android--Activity的启动模式
- Android--Activity的启动模式
- Android activity的启动模式
- android activity 的启动模式
- Android Activity的启动模式
- Android-Activity的启动模式
- dynamic_message.h
- Unity3D 代理的使用及获取两个碰撞器的碰撞点
- 第10周 项目3-1 血型统计(字符函数)
- windows+php5.5+apache2.4+tomcat+mod_jk配置
- 软件质量保证相关概念(1)
- Android的启动模式
- 简单ListView+长按删除
- message.h
- 【SGU】108. Self-numbers 2
- MySQL 数据库的启动与关闭
- SlidingMenu 详解
- 【android】使用SharedPreferences存取复杂数据
- message_lite.h
- Linux下Tomcat的安装配置