Android笔记之四种launchMode

113 篇文章 0 订阅

一、先来了解Task

Task顾名思义,任务,每一个Android应用在运行的时候,都会创建和维护一个属于自己的任务,而事实上,Task是一个包含栈结构的容器,该栈通常叫回退栈,用来保存当前所有Android应用中已经创建的窗口对象,通常我们看到的界面就是处于回退栈栈顶的窗口对象。当我们打开新的一个界面,那么之前的界面(窗口对象)就会压入栈内,让出栈顶位置给新来的界面(窗口对象);当关闭该窗口对象时,系统会首先将该对象弹出栈,并销毁该对象。当栈里最后一个窗口对象被弹出栈后,回退栈为空,这时候回退栈被销毁,应用停止。(应该注意到,这时候,应用并没有完全退出内存,它的部分资源如静态变量还会在内存中停留很长时间。)

此外有一点需要注意的是,每一个应用都有一个独一无二的task,当打开新的一个应用时,它的task出现在前台,显示给用户,而旧的task将会转入后台,这时候系统会自动保存旧task窗口对象的状态,等该task被重新切换到前台运行后,该窗口回复焦点的同时也会恢复所有的状态,然而。必须指出一点,不要以为处于后台的task会一直停留在内存里,等待你回来。当手机内存被耗尽,或者新打开一个APP需要大量内存的时候,你所以为会等你的旧task将会无情地被系统干掉,哪个task被停止的时间越久越先被销毁。

二、四种启动模式launchMode

Activity有四种加载模式:

standard
  • singleTop
  • singleTask
    • singleInstance

      设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:

      模式

      具体描述

      standard

      launchMode的默认值,在新建Activity时默认不写,就已经是该模式,每调用一个startActivity,系统就会新实例化一个窗口对象,回退栈里就多一个该实例的窗口对象。除非是按back键或者在代码里调用finish()方法,否则一直存在直到应用停止。不管有没有已存在的实例,都生成新的实例。

      singleTop

      如果窗口的实例刚好是在当前界面(即回退栈的栈顶),那么系统将不再创建新的窗口对象(standard模式则不同,不管是不是栈顶都会新建),直接使用该窗口实例。这样做的好处就是只要需要用的实例一直在界面上,回退栈里就只有一个实例,要退出时按下一次就能直接退出(因为只有一个窗口对象),这个模式在NFC中使用特别合适。

      如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例。但是,注意一点,它只看栈顶,不看栈里,如果栈顶没有该实例,栈里也有,它也依然会新建一个窗口对象的实例。

      singleTask

      这个模式比较强权和霸道,即如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示在当前界面,而不会新建该实例。如果该窗口实例不存在则会新建,并置于栈顶。

      singleInstance

      该模式更加独断专行,如果当前回退栈中有,则将它之前的实例对象全部清除出去,然后自己置于栈顶,如果当前回退栈没有,它会新建一个回退栈,然后新建一个实例对象,并且不允许其他实例对象进来。该模式很少用,因为新建一个只用于一个实例对象的回退栈太费内存空间。且意义不大。

      上述文字比较枯燥,并且没有具体的例子。没写例子的原因是因为有前辈已经写了很详细的分析实例了。如果你还不太懂,请看这篇博文。http://blog.csdn.net/liuhe688/article/details/6754323


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值