zoukankan      html  css  js  c++  java
  • Android基础之Activity launchMode详解


    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!

           Activity的lauchmode,是基础的属性,但也是App优化必须掌握的知识,它约束了Activity生命周期中各个方法的使用。做了许多个项目,对此有一点小小的总结,希望对大家能有些许帮助。

           先讲一个概念性问题,AndroidManifest.xml中对Activity启动模式的定义android:launchMode="",有四个值可选,分别是:standard,singleTask,singleTop,singleInstance。它们主要用来定义Activity在堆栈中的存在方式。


            一般一个应用打开的所有Activity都在一个栈里,位于栈底的Activity最后退出;打开了其它应用,那么就需要另开一个task,因为打开的Activity属于其它应用;每个应用都在自己的task里运行,也即是说每个task就是一个应用程序。


             通常我们可以用一个Activity使用startActivity来启动另一个Activity,这个Activity可以是本应用的,也可以是其它应用,但不同的启动方式会给用户带来不同的体验,所以理解其中的意思会在完成任务时,做出更好体验度的应用来。


             系统通过栈来管理Activity,栈是个先进后出的概念,通过back键来弹出Activity实例,位于栈底的Activity最后被弹出,一般要设为singleTask。


            然后我们来一个个讲解各个值的意思,Acivity启动默认为standard,即可以不设,这样的Activity每次startActivity都会新建一个实例对象(Activity的实例,存在Activity的管理栈里),像标记为standard的Activity可以在栈里存在若干个,跟其他在一个task里工作,不新启动task。


            singleTop指启动的Activity在栈顶则不新建,传递数据通过onNewIntent()。通常设为singleTop的Activity,保证它在最顶部,跟其他在同一个task里工作,不新启动task。


            singleTask指该Activity如果存在,则不新建,直接使用,此时一般要实现onNewIntent()来接收数据传递;否则新建一个task,把此Activity装进去,被标记为singleTask的Activity会存放在同一个task中。

    重新打开执行:onNewIntent->onRestart->onStart->onResume->onPostResume


            singleInstance跟singleTask差不多,不过标记的Activity单独存在一个task里;有几个这样的Activity,则栈里会有几个这样的task来装它们,被标记为singleInstance的Activity不会放在同一个task中。

    重新打开执行:onNewIntent->onRestart->onStart->onResume->onPostResume


            另一点不同在于标记为singleTask的Activity被自启动后,有刷新界面的感觉,但被标记为singleInstance的则不会,所以需要刷新自身数据,自启动的同学就要注意了!


    另外,当按下Home键时,如果你的当前页面不是主Activity,但再次进入的时候进入主Activity,这是为什么呢?

    因为设置launchmode=singleTask|singleInstance的原因。我们知道这两个启动模式都是新启一个task,装载当前的activity,

    所以,按下Home键再次启动时,当前栈里只有一个主activity,所以启动的还是它执行onRestart->onStart->onResume,而且按下Home前最后打开的页面会执行onDestroy方法。

    现象2:如果主Activity启动方式是singleInstance,那么按下Home键,它始终会被关闭; 设为singleTask则不会。

            总而言之,launchmode的设置是一种Activity栈管理的方式,如对象设置引用类型是一种内在管理方式一样。





  • 相关阅读:
    理解.NET中的异常(二)
    路径,文件,目录,I/O常见操作汇总(一)
    使用PInvoke.NET插件为托管代码添加Win32 API签名
    使用JavaScript检测浏览器的相关特性
    javascript中的变量
    曾经的你
    WinampMy Favorite Media Player
    新的开始,认真地写博客
    log4net的各种Appender配置示例
    使用GhostDoc为代码生成注释文档
  • 原文地址:https://www.cnblogs.com/fengju/p/6174453.html
Copyright © 2011-2022 走看看