在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。

Android总Activity的启动模式分为四种:

Activity启动模式设置:

<activity android:name=".MainActivity"android:launchMode="standard" />

Activity的四种启动模式:

1.standard

模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。

2.singleTop

如果在任务的栈顶正好存在该Activity的实例,就重用该实例,并且会调用实例的OnNewIntent()方法,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。

3.singleTask

如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

4.singleInstance

在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。

其中standard是系统默认的启动模式。

初始界面如下:


下面通过实例来演示standard的运行机制:

当点击按钮时,会创建新的Activity,通过TextView@后16进制数的显示即可看出,点击两次分别界面如下:

三次显示的内容都不一样,而且点击返回键以后会一次返回到上一级Activity。

 此时,我们分析栈内部的运行机制:

   (依次从栈顶向上)

因此,这种Standard模式是每次都会创建新的Activity对象,当点击返回按钮时,他会将栈顶(当前Activity)消灭,然后跳到前
一层,例如如果现在Activity是40540100,那么当我们点击返回时Activity会变为40538d10,不过此时在这个Activity
中再次点击按钮创建对象时,它会另外创建新的Activity对象,这种模式可能大多数情况下不是我们需要的,因为对系统性能的消耗过大。

举个例子:

、假如你从主页进入一个页面中浏览信息如果里边有个链接是返回主页,如果你的页面是用standard模式,那么就会新创建一个主页的对象,当你返回的时候你就会返回到上一级浏览信息的界面,再返回会返回到上一级界面也就是主页,如果你在里边进行了多次操作,那么就会产生很多垃圾对象,占用大量的内存空间。

、假如你的页面中有一个按钮或者链接能再次启动当前页面,那么你就会再次创建一个当前页面的对象,这样就造成了对象的重复创建。

平时我们对于这种事件的解决都是在启动Intnet后把当前不需要的页面给finish()掉,这样可以解决。但是也就多写了一行代码,可能会影响效率。

2. singleTop

从上面的解释中即可知道,在每次使用新的Activity时会自动检测栈顶的当前Activity是否是需要引用的Activity,如果是则直接引用此Activity,而不会创建新的Activity。

我们在刚才的界面中加入一个"启动singletop模式"按钮,当点击时出现我们创建的singletop中,在Activity
singletop中有一个按钮,启动singletop模式,表示启动当前Activity,由于我们在清单文件中配置Activity的启动模式为
singleTop,因此此时不会再创建而是利用当前栈顶的singleTopActivity:

  1. <activity
  2. android:name=".SingleTopActivity"
  3. android:launchMode="singleTop" />

初始化:

点击"启动singleTop模式"按钮

我们分析它的运行机制,可知,当程序运行到此时,栈中的数据形式为:

虽然它不会创建新的Activity对象,不过它每次会调用onNewIntent()方法:

  1. @Override
  2. protected void onNewIntent(Intent intent) {
  3. // TODO Auto-generated method stub
  4. super.onNewIntent(intent);
  5. Toast.makeText(this, new Date().toString(), 1).show();
  6. }

我们为此方法编写代码输出当前日期,则在每次点击上面按钮时会输出当前日期。

这种模式就解决了在当前页面下依然启动自身页面而创建多余对象的问题,每次启动都会判断需要启动的页面是否是在栈的最顶端也就是当前页面,如果是就调用已有的对象不在创建重复的对象。

3. singleTask

此启动模式和singleTop在名字上即可看出区别,即singleTop每次只检测当前栈顶的Activity是否是我们需要请求创建的,而
singleTask则会检测栈中全部的Activity对象,从上向下,如果检测到是我们所请求的则会消灭此Activity对象上面的对象,直接把检
测到的我们需要的Activity置为栈顶。

我们创建一个SingleTaskActivity,此界面中包含一个启动MainActivity和启动SingleTaskActivity按钮。

初始化:

点击"启动singleTask模式"按钮:

在此界面中点击第二个按钮"启动singleTask模式"按钮,根据定义会检测当前栈中是否有此Activity对象,因此显示的还是当前的Activity,不会重新创建;

再点击"启动Standard模式"按钮,由于MainActivity的启动模式为standard,所以在此会重新创建一个MainActivity对象:

再次点击启动Standard模式:

此时栈中数据格式为:

这种模式就挺适合在多次操作后,如果想要回到最开始的页面,那么启动以后不但能回到那个页面,而且这其中所有的操作页面均销毁。减少了垃圾对象占用的内存空间。

4.SingleInstance

  此启动模式和我们使用的浏览器工作原理类似,我们都知道在多个程序中访问浏览器时,如果当前浏览器没有打开,则打开浏览器,否则会在当前打开的浏览器中访问。此模式会节省大量的系统资源,因为他能保证要请求的Activity对象在当前的栈中只存在一个。

1)全局单实例,该Activity在销毁前只能被创建一次

2)在任何地方启动该Activity,如果该Activity未创建,则直接在新的task中创建该activity,如果以创建,则将其所在的task带回前台。执行onNewIntent方法

3)该Activity不与任何其它activity存在于同一task中

OnNewIntent():

该方法是activity的一个保护类型的方法,利用已有的Acivity去处理别的Intent时,你就可以利用onNewIntent来处理,通常被用在有搜索请求的activity,而其该activity有好几个intent-filter,该方法被调用的前提
a、该activity设置如下属性android:launchMode="singleTop | singleTask",。
b、该activity已经处在栈的顶端,通过其他的方法又重新启动该acitvity时被调用,如搜索,这时oncreate()方法不调用。

Android中Activity启动模式详解的更多相关文章

  1. Android开发——Activity启动模式详解

    1. Activity的启动模式 本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52054893 1.1 Standard标 ...

  2. Android Activity 启动模式详解

    最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...

  3. Android之Activity启动流程详解(基于api28)

    前言 Activity作为Android四大组件之一,他的启动绝对没有那么简单.这里涉及到了系统服务进程,启动过程细节很多,这里我只展示主体流程.activity的启动流程随着版本的更替,代码细节一直 ...

  4. Android中Activity启动模式探索

    Android中启动模式(launchMode)分为standard, singleTop, singleTask, singleInstance四种,可通过AndroidManifest.xml文件 ...

  5. 第二课android中activity启动模式

    一.标准启动模式可以用函数gettaskid得到任务的idtostring得到地址用textallcaps来设置是否全部大写应用启动自己是在任务栈里创建不同实例可以用返回来返回上一个任务栈在andro ...

  6. android学习-Activity启动过程详解

    注:只是说明启动activity的过程(ActivityThread如何与ActivityManagerService简称AmS进行进程间通信调用全过程),不解析android从zygote(受精卵) ...

  7. Activity的启动模式详解

    Activity的启动模式详解 Activity有四种载入模式:standard(默认), singleTop, singleTask和 singleInstance. (1).standard(默认 ...

  8. Android中Service的使用详解和注意点(LocalService)

    Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...

  9. Android中的windowSoftInputMode属性详解

    这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下     在前面的一篇文章中 ...

随机推荐

  1. unity延时方法Invoke和InvokeRepeating

    MonoBehaviour里面有两个内置的延时方法 Invoke Invoke(methodName: string, time: float): void; methodName:方法名 time: ...

  2. 《APUE》中的函数整理

    第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. ...

  3. Mahout应用(一)

    Mahout应用(一) Mahout 是应用于hadoop上的数据挖掘工具(废话不多说) 这里先简单介绍一下mahout的一般使用方法. 拿kmeans为列子 Mahout中的kmeans所需要的输入 ...

  4. nova --debug image-list

    nova --debug image-list DEBUG (session:) REQ: curl -g -i -X GET http://liberty-aio:35357/v3 -H " ...

  5. linux高级数据存储

    linux内此存储模式由5部分组成,自低向上的顺序: 物理卷,内核块设备驱动,内核文件系统驱动,虚拟文件系统,应用程序数据结构; 系统中所有的文件仅按此模式存储,无论是数据还是元数据,均在此模式下统一 ...

  6. (转)关于CoreData的一个工具Mogenerator的使用

    最近看到用CoreData时使用的工具Mogenerator,发现网上介绍其具体使用的不多,特此简单整理一下,关于CoreData这里就不具体说了,使用就用MagicalRecord,用起来真是太方便 ...

  7. 扩展KMP题目

    hdu4333 /* 题意:字符串s[0..n-1],每次把最后一个字符放到前面,求形成的字符串比最初串分别小,相同,大于的个数 因为是为了练习扩展KMP所以肯定是扩展KMP, 为了循环方便,在后面复 ...

  8. DATASNAP多表提交之事务控制之通用方法

    ERP系统的单据,总是些主从表结构,有一个主表,N个子表,子表又有子表,形成N层,单据数据提交时,主从表数据都要提交,为了保证数据的完整性,必须提供事务控制,要么都提交成功,有一个提交失败所有的提交都 ...

  9. HDU 1068 Girls and Boys (二分图最大独立集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068 有n个同学,格式ni:(m) n1 n2 n3表示同学ni有缘与n1,n2,n3成为情侣,求集合 ...

  10. (转)WordPress的主查询函数-query_posts()

    今天说说WordPress 的主查询函数 -query_posts(),因为我正在制作的主题里面多次用到了这个函数 . query_posts()查询函数决定了哪些文章出现在WordPress 主 循 ...