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. Activity的Flags

大部分情况我们不需要为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. github添加版本号

    1.将官方的库clone下来 http://github.com/xxx.xxx.git 2.修改要修改的地方 3.git add src 4.commit -m 'xxx'   5.git push ...

  2. Sql Server 排序规则字符集的冲突问题

    可通过如下sql 进行修改: 如果整个DB都不一致: Alter database Expense_Portal collate Chinese_PRC_CI_AS 某张Table的栏位不一致: ) ...

  3. django-Haystack库

    本文参考自Haystack官方文档:https://django-haystack.readthedocs.io/en/master/tutorial.html#configuration 简介 Ha ...

  4. 8、二进制中1的个数------------>剑指offer系列

    题目 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 法一:分析 这是一道考察二进制的题目 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1. 二进制 ...

  5. 高性能Javascript总结

    一.加载和运行 Javascript代码执行会阻塞其他浏览器处理过程.充分利用webpack或gulp工具对文件打包压缩,减少js文件的数量,从而减少http请求的次数,以提高网页应用的实际性能. 二 ...

  6. 阿里云栖社区dubbo 资源整理

    1.apache dubbo pdf git 地址:https://github.com/dubbo/awesome-dubbo/tree/master/slides/meetup/201905%40 ...

  7. sublime快捷键mark

    Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的多行时)Ctrl+L 选择整行(按住-继续选择下 ...

  8. 闹心的CSDN

    近来搜索技术文章时,每次来到csdn上时,显示全文就提示登陆. 唉登陆就登陆吧,记不清账号了,就用手机号获取验证码.然后更改密码.我靠,密码居然要8位以上,要有大小写字母.数字和标点符号的组合... ...

  9. MySQL流程控制和存储过程介绍

    /*定义变量方式1:set @变量名=值;方式2:select 值 into @变量名;方式3:declare 变量名 类型(字符串类型加范围) default 值; in参数 入参的值会仅在存储过程 ...

  10. 10048 - Audiophobia (Floyd)

    Floyd的变形,本质是动态规划,路径分成的两个部分中取最大值作为该路径的答案,在所有可行路径之中选一个最小值. #include<bits/stdc++.h> using namespa ...