简介

Android中的活动启动方式分为4种:standard, singleTop, singleTask, singleInstance。可以在AndroidManifest.xml中通过给<activity>标签的android:launchMode来制定。

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

standard

默认的启动方式,当启动活动时,创建并将其放在返回栈中,不管其中有没有该活动。通过adb shell dumpsys activity activities可以查看到启动两次同一个的Activity时的情形:

Running activities (most recent first):
TaskRecord{b1ddaad # A=com.wision.www.launchmode U= sz=}
Run : ActivityRecord{aa96ea u0 com.wision.www.launchmode/.StandardActivity t1516}
Run : ActivityRecord{8f9bf5c u0 com.wision.www.launchmode/.StandardActivity t1516}
Run : ActivityRecord{82afe1b u0 com.wision.www.launchmode/.MainActivity t1516}

注意:在lollipop之前,从其它应用程序启动的standard Activity会放在同一个Task中;在lollipop之后,当从其他程序启动standard的Activity时,会放在另外一个task中,方便切换回启动的activity

singleTop

如果调用的目标Activity已经位于调用者的Task的栈顶,则不创建新实例,而是使用当前的这个Activity实例,并调用这个实例的onNewIntent方法。

Running activities (most recent first):
TaskRecord{3a58686 # A=com.wision.www.launchmode U= sz=}
Run : ActivityRecord{f42de2d u0 com.wision.www.launchmode/.SingleTopActivity t1517}
Run : ActivityRecord{10c724e u0 com.wision.www.launchmode/.MainActivity t1517}

但是当该活动不在栈顶的时候并不影响继续创建:

Running activities (most recent first):
TaskRecord{1aa2156 # A=com.wision.www.launchmode U= sz=}
Run : ActivityRecord{42b1119 u0 com.wision.www.launchmode/.SingleTopActivity t1519}
Run : ActivityRecord{712c2eb u0 com.wision.www.launchmode/.StandardActivity t1519}
Run : ActivityRecord{bc6e1ad u0 com.wision.www.launchmode/.SingleTopActivity t1519}
Run : ActivityRecord{93f7493 u0 com.wision.www.launchmode/.MainActivity t1519}

注意:该模式的Activity不管怎么启动都会和启动Activity在同一个task中

singleTask

用来解决重复创建的问题的,当返回栈中存在活动的实例的时候,直接使用该活动。同时

将活动之上的所有活动统统出栈,意味着所有该活动之前入栈的活动的onDestroy都会被调用。比如,返回栈如下时启动SingleTaskActivity:

Running activities (most recent first):
TaskRecord{ # A=com.wision.www.launchmode U= sz=}
Run : ActivityRecord{a3fb857 u0 com.wision.www.launchmode/.MainActivity t1527}
Run : ActivityRecord{60170b9 u0 com.wision.www.launchmode/.SingleTaskActivity t1527}
Run : ActivityRecord{a9f9c08 u0 com.wision.www.launchmode/.MainActivity t1527}
- ::14.107 -/com.wision.www.launchmode D/MainActivity: onPause
- ::14.116 -/com.wision.www.launchmode D/SingleTaskActivity: onRestart
- ::14.117 -/com.wision.www.launchmode D/SingleTaskActivity: onStart
- ::14.117 -/com.wision.www.launchmode D/SingleTaskActivity: onResume
- ::14.117 -/com.wision.www.launchmode D/SingleTaskActivity: onPostResume
- ::14.185 -/com.wision.www.launchmode D/OpenGLRenderer: endAllStagingAnimators on 0xa0686600 (RippleDrawable) with handle 0xa0f07320
- ::14.456 -/com.wision.www.launchmode D/MainActivity: onStop
- ::14.456 -/com.wision.www.launchmode D/MainActivity: onDestroy

注意:1,针对于singleTask属性,Activity可以放在启动Activity的同一个Task中,也可以放在新创建的一个Task中,取决于是否指定了taskAffinity。

2, singleTask模式使用在只保留一个实例的Activity中,比如收件箱。使用时要注意,因为启动的过程中会毁掉其他的Activity。

singleInstance

singleInstance类似于singleTask,唯一的区别就是singleTask允许别的Activity被启动到它Task中,但是singleInstance不允许,singleInstance的Task中有且只有一个实例。当按照standard->singleInstance->standard顺序启动的时候,如果按back键退出,则直接返回到第一个standard,然后再次back才会返回到singleInstance Activity,这是因为第一个和第三个standard Activity在同一个返回栈中,只有当这个栈全部清空了才会返回到singleInstance的栈中。

参考:

  1. 第一行代码
  2. 技术小黑屋: 深入讲解Android中Activity launchMode

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

  1. 【Android学习入门】Android中activity的启动模式

    启动模式简单地说就是Activity启动时的策略,在Androidmanifest.xml文件中的标签android:launchMode属性设置,在Android中Activity共有四种启动模式分 ...

  2. Android中Activity的启动模式(LaunchMode)和使用场景

    一.为什么需要启动模式在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中.当我们点击返回(back)键,这些Ac ...

  3. Android中Activity的启动模式和使用场景

    一.为什么需要启动模式 在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中.当我们点击返回(back)键,这些A ...

  4. 转 Android中Activity的启动模式(LaunchMode)和使用场景

    转载请注明出处:http://blog.csdn.net/sinat_14849739/article/details/78072401本文出自Shawpoo的专栏我的简书:简书 一.为什么需要启动模 ...

  5. 【android】android中activity的启动模式

    在AndroidManifest.xml中配置 <activity android:label="第二个应用" android:name=".Demo2Activi ...

  6. Android之Activity的启动模式

    启动模式有4种,分别为:1.standard(默认)  -- 标准2.singleTop  -- 单顶3.singleTask -- 单任务4.singleInstance: -- 单例  -- 如果 ...

  7. Android中Activity启动模式详解

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

  8. android Activity的启动模式

    Android中Activity启动模式详解   在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启 ...

  9. Android开发9——Activity的启动模式

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

随机推荐

  1. Ubuntu 12.04 Virtualbox 启用USB 设备支持

    转载自:http://www.cnblogs.com/ericsun/archive/2013/06/10/3130679.html 具体步骤在上面的链接中 今天在ubuntu下安装了Virtualb ...

  2. ie6、7 下input的边框问题 ?

    input的border设置为none,ie8及以上border都兼容,ie6和7的border还继续存在,将border设为0时所有浏览器上都不存在了,但是border为0时还是会继续的渲染. 将i ...

  3. JSON生成c#类代码小工具

    JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...

  4. EasyUI-datagrid 对于展示数据进行处理(formatter)

    一:声明datagrid列,在列中添加formatter属性,并指定js方法 columns = [[ { title: '编号', field: 'Id', width: 100, sortable ...

  5. Nginx模块之———— RTMP模块 统计某频道在线观看流的客户数

    获得订阅者人数,可以方便地显示观看流的客户数. 查看已经安装好的模块 /usr/local/nginx/sbin/nginx -V 安装从源编译Nginx和Nginx-RTMP所需的工具 sudo a ...

  6. ${param.xxx}获取url中的参数

    在项目中看到了一个很奇怪的EL表达式...${param.catid}...一直找不到param在哪里定义的...(主要是水平太屎...) 然后从网上查了一下才知道是啥... EL表达式${param ...

  7. 一句话简单理解javascript中的原型对象

    通过构造函数F创建的对象实例p 这个对象p的原型对象是 构造函数中prototype属性指向的对象s,这个对象p中也有个非标准的__proto__属性指向构造函数prototype属性所指向的对象s, ...

  8. ROS学习笔记(七)——节点

    NEW 1 #打开新的终端,以后不再注释$ sudo apt-get install ros-<distro>-ros-tutorials #下载一个教学用的仿真器$ roscore #运 ...

  9. 微信微信JS-SDK 6.0.2 填坑笔记

    0.为什么以前不需要配置这么麻烦就可以修改分享description 等信息,但是现在不行了. 因为6.0.2版本之前没有做权限验证,所以config都是ok,但这并不意味着你config中的签名是O ...

  10. 将项目上传到git上,并在测试服务器上运行

    上周我完成了我人生的第一个项目,并将它上传到gitHub上完成了团队合作.下面我将用倒叙的方法记录下,我的这段经历. 星期五,项目完成准备上传gitHub启动测试服务器. 1.git clone 项目 ...