1. Activity的启动模式

本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52054893

1.1 Standard标准模式

系统默认的启动模式,即便实例存在,每次启动都会创建一个新的实例,每个实例可以属于不同的任务栈。

若ActivityA以此模式启动了Activity B,那么B会进入A所在的栈。注意,若是非Activity类型的Context,如ApplicationContext,并没有任务栈,因此以ApplicationContext启动Standard模式的Activity会报错。我们可以在启动时创建一个新的任务栈,指定FLAG_ACTIVITY_NEW_TASK标记位。(此时实际上是以SingleTask模式启动)。标记为下文会讲述。

1.2 SingleTop栈顶复用模式

这种模式下,若新的Activity已位于栈顶,就不会重复创建。不同于Standard模式,此时这个Activity因为没有发生变化,它的onCreate、onStart不会被调用。

但是它的onNewIntent方法会被调用,通过此方法的参数可以得到请求信息。

1.3 SingleTask栈内复用模式

这种模式下,Activity想要的任务栈如果存在,并且此Activity在此栈中存在实例,多次启动此Activity都不会重新创建实例。同时该模式具有clearTop的效果,已存在的实例上面的Activity全部出栈。onNewIntent方法会被调用。若不存在该实例就新建并压入该栈。

如果想要的任务栈不存在,就新建一个任务栈,并创建Activity实例放入该栈。

1.4 SingleInstance单实例模式

具有SingleTask模式的所有特性,此模式启动的Activity只能单独位于一个任务栈(新建的)。后续请求除非这个特殊的任务栈被销毁,否则不会创建新的Activity实例。

如SingleTask模式一样,如果按照相同的模式再次某Activity,不重新创建,只是暂停onStop了下,并且调用onNewIntent方法。接着调用onResume就又继续了。

2. TaskAffinity属性

TaskAffinity属性标识了一个Activity所需要的任务栈的名字。默认为应用包名。

当TaskAffinity属性和SingleTask启动模式结合使用时,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中。

当TaskAffinity属性和allowTaskReparenting结合使用时,若应用A启动应用B中的Activity C(C运行在A的任务栈中),并且此Activity的allowTaskReparenting = true,当应用B被启动后,B的主Activity不会显示,因为Activity C会直接从应用A的任务栈转移到应用B的任务栈中(因为C想要的任务栈被创建了),所以会显示Activity C。

3. 指定启动模式

3.1 通过AndroidMenifest.xml为Activity指定

android:launchMode = "singleTask"

3.2  通过Intent标识Activity指定

Intent intent = new Intent();
intent.setClass(MainActivity.class,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

两种设置方式,第一种优先级较低,并且无法直接给Activity设置FLAG_ACTIVITY_CLEAR_TOP标识。

第二种无法为Activity指定singleInstance模式。


4. ActivityFlags

大部分情况我们不需要为Activity设置标记位,下面介绍几种比较常用的标记位。

4. 1 FLAG_ACTIVITY_NEW_TASK

这种Activity标记位,作用是为Activity指定SingleTask的启动模式。和在清单文件里设置效果相同。

4. 2 FLAG_ACTIVITY_SINGLE_TOP

这种Activity标记位,作用是为Activity指定SingleTop的启动模式。和在清单文件里设置效果相同。

 

4. 3 FLAG_ACTIVITY_CLEAR_TOP

SingleTask模式默认具有此标记效果,即被启动Activity的实例已经存在,onNewIntent方法会被调用,已存在的实例上面的Activity全部出栈。

如果是Standard启动模式,那么它连同它之上的Activity都要出栈,并创建新的Activity实例入栈。

 

4. 4 FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

效果和在清单文件里指定android:excludeFromRecents = “true”相同。即不会出现在历史Activity列表中。

Android开发——Activity启动模式详解的更多相关文章

  1. Android中Activity启动模式详解

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

  2. Android Activity 启动模式详解

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

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

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

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

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

  5. Activity的启动模式详解

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

  6. Android Activity的4种启动模式详解(示例)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个A ...

  7. Activity的四种启动模式详解

    Activity的启动模式在清单文件AndroidManifest.xml中的Activity属性中进行设置: 如:<activity android:name=".MainActiv ...

  8. Android开发——事件分发机制详解

    0. 前言   转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52566965 深入学习事件分发机制,是为了解决在Android开发中 ...

  9. Android开发:程序目录结构详解

    HelloWorld程序的目录结构概述 我们可以在文件夹中看到,HelloWorld程序的目录主要包括:src文件夹.gen文件夹.Android文件夹.assets.res文件夹. AndroidM ...

随机推荐

  1. 部署iis服务器与c#程序遇到的问题小结

    记得上次部署IIS服务器比较顺利,半天搞定的?有点忘了. 但,服务器版本各有不同,这次装的是server2008 R2 Ennterprice版.虽然忘了上次装的是哪个版本,但进去后发现有些东西明显不 ...

  2. 03.Javascript——入门一些方法记录之Map和Set

    JavaScript的默认对象表示方式{}可以视为其他语言中的Map或Dictionary的数据结构,即一组键值对. 但是JavaScript的对象有个小问题,就是键必须是字符串.但实际上Number ...

  3. msyql 死锁

    1.使用 show processlist; 查询当前进程; 找到Command 状态是query 并且Time 时间很长的id kill掉即可 2.select * from information ...

  4. 开源GIS-对比GeoServer和MapServer

    1  主流组合: 基于C.C++系列的:Mapserver(服务器)+QGIS(桌面软件)+PostGIS(数据库)+Openlayers(JS)/ openscale (FLex)(浏览器客户端) ...

  5. 第十章 设计用户界面 之 构建UI布局

    1. 概述 本章内容包括:实现可在不同区域重用的片段.使用Razor模板设计和实现页面.设计可视结构的布局.基于模板页开发. 2. 主要内容 2.1 实现可在不同区域重用的片段 最简单的重用方式就是在 ...

  6. 《超实用的HTML代码段》阅读笔记1——HTML5自动聚焦

    在页面加载完成后自动将输入焦点定位到需要的元素,用户就可以直接在改元素中进行输入而不需要手动选择它. 通过autofocus的属性就可以指定这种自动聚焦的功能,示例代码如下: <form nam ...

  7. viewpager的使用-新方法 5.1

    效果图: 添加依赖包: compile ‘com.android.support:design:22.2.0‘ 布局文件: <?xml version="1.0" encod ...

  8. 【NumPy学习指南】day5 改变数组的维度

    我们已经学习了怎样使用reshape函数,现在来学习一下怎样将数组展平. (1) ravel 我们可以用ravel函数完成展平的操作: In: b Out: array([[[ 0, 1, 2, 3] ...

  9. LeetCode Isomorphic Strings 对称字符串

    题意:如果两个字符串是对称的,就返回true.对称就是将串1中的同一字符都一起换掉,可以换成同串2一样的. 思路:ASCII码表哈希就行了.需要扫3次字符串,共3*n的计算量.复杂度O(n).从串左开 ...

  10. 洛谷 P1276 校门外的树(增强版)

    题目描述 校门外马路上本来从编号0到L,每一编号的位置都有1棵树.有砍树者每次从编号A到B处连续砍掉每1棵树,就连树苗也不放过(记 0 A B ,含A和B):幸运的是还有植树者每次从编号C到D 中凡是 ...