本文来自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栈管理的方式,如对象设置引用类型是一种内在管理方式一样。

Android基础之Activity launchMode详解的更多相关文章

  1. Android组件系列----Activity组件详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  2. Android application 和 activity 标签详解

    extends:http://blog.csdn.net/self_study/article/details/54020909 Application 标签 android:allowTaskRep ...

  3. Android之路-------Activity的详解

    前言 由于接近放假,公司在赶项目所以前段LP比较忙,没什么时间总结和写博客,只是准备睡觉的时候看看书,每天看的不算多,大概10多页左右吧,不过每天坚持如此的话那也是一个庞大的数字. 今天LP的任务完成 ...

  4. Android Fragment与Activity通讯详解

    与activity通讯 尽管fragment的实现是独立于activity的,可以被用于多个activity,但是每个activity所包含的是同一个fragment的不同的实例. Fragment可 ...

  5. Android 之窗口小部件详解(三)  部分转载

    原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...

  6. Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!

    Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...

  7. Activity知识点详解

    Activity知识点详解 一.什么是Activity 官方解释: The Activity class is a crucial component of an Android app, and t ...

  8. Android图片缓存之Bitmap详解

    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...

  9. Android Design Support Library使用详解

    Android Design Support Library使用详解 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的And ...

随机推荐

  1. 内部类&匿名内部类

    内部类:如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象.这时,为了方便设计和访问,直接将A类定义在B类中.就可以了.A类就称为内部类.内部类可以直接访问外部类中的成员.而外部类想要访问内 ...

  2. cocos2dx 3.x中的渲染机制

    1.由2.x的渲染节点,变成添加渲染命令,可以避免重复渲染相同的节点,提高了渲染效率 2.单机游戏通常要求apk包在30M以内,没压缩1M会有1%的转换率(下载转换率),即收入会提高 3.2.x中首先 ...

  3. 启动级别:init 0,1,2,3,4,5,6

    这是个很久的知识点了,只是自己一直都迷迷糊糊的,今天在翻出来好好理解下.. 0:停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system 3:完全多用户 5:图形化 ...

  4. gameObject, vector and transform

    调用其它组件中成员 通过GameObject(游戏物体). Base class for all entities in Unity scenes.  是Unity场景里面所有实体的基类. 可以理解为 ...

  5. Careercup - Google面试题 - 5724823657381888

    2014-05-06 06:37 题目链接 原题: Given an array of (unsorted) integers, arrange them such that a < b > ...

  6. js分页

    今天看了下妙味课堂的教程,写了下关于分页的js代码,写完的感觉就是有点小麻烦,需要很多if判断,思路要清晰 点击预览:http://peng666.github.io/blogs/page <! ...

  7. linshiwendang12--匈牙利

    #include<bits/stdc++.h> #define N 10007 using namespace std; vector<int> p[N]; bool vis[ ...

  8. 【转载】Extjs 中id与itemId的区别

    为了方便表示或是指定一个组件的名称,我们通常会使用id或者itemId进行标识命名.(推荐尽量使用itemId,这样可以减少页面唯一标识而产生的冲突) id:        id是作为整个页面的Com ...

  9. bzoj 1196 二分+生成树判定

    我们先二分一个答案,对于每个答案,先加一级公路,如果不够k直接break, 然后再加二级公路,加的过程类似Kruskal. /************************************* ...

  10. Windows键盘快捷键