博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Android学习】之Activity的启动模式
阅读量:6619 次
发布时间:2019-06-25

本文共 1984 字,大约阅读时间需要 6 分钟。

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/50821710

前面的博客中介绍了Activity的生命周期。除了Activity的生命周期外,Activity的启动模式也是一个我们学习Android的难点。

1、Activity的LaunchMode

首先我们来介绍一下什么是Activity的启动模式,以及为什么需要Activity的启动模式。下面我们用一个例子来说明:

当我们在默认情况下创建一个Activity的时候,在多次调用该Activity的时候,系统会创建多个该Activity的实例,并把他们放入任务栈中,当我们按back键的时候,会发现这些Activity会以“后进先出”的方式回退,直到栈空时,系统会回收任务栈。

 在这之中我们会发现Activity这样重复创建是不是很麻烦,这就出现了Activity的启动模式,目前Activity的启动模式有四种:standard,singleTop,singleTask,singleinstance。

1.1、standard(标准)模式

所谓标准模式就是我们最常用的系统默认模式,每次启动一个Activity不管这个Activity的实例是否存在,都会重新创建一个新的Activity实例,这种模式的Activity符合典型情况下的生命周期:它的OnCreat(),OnStart(),onResume()都会被调用。

1.2、singleTop(栈顶复用)模式

栈顶复用顾名思义就是在栈顶重复使用,在这种模式下,如果需要启动的Activity已经在任务栈的栈顶,那么任务栈不会被重新创建,同时会调用它的onNewIntent方法,通过此方法的参数我们可以取出当前请求的信息,这种情况下不会调用OnCreat(),OnStart()。

例:当前栈内由栈底到栈顶有ABC三个Activity,假设再次启动C,若C的启动模式为singleTop那么就不会创建C,栈内仍然为ABC。若启动模式为standard,C会被再一次创建,那么栈内情况就是ABCC。

1.3、singleTask(栈内复用模式)

这是一种单例模式,在这种模式下只要Activity在栈中存在,那么多次启动该Activity都不会创建实例,和singleTop一样,系统也会回调其onNewintent。

这种模式下系统首先会寻找A所需要的任务栈,如果任务栈不存在则之间创建任务栈并创建A加入到栈中。如果A所需要的任务栈存在,则再寻找是否存在A的实例,如果存在则将A调到栈顶。如果不存在那么系统会创建A的实例,并压入栈中。

例1:当前栈S1内情况如下:系统要启动Activity的实例 C在栈S2中。则系统首先会创建栈S2,然后再创建Activity的实例C并压入栈中。

    

          图1          图2     图3     图4       图5

例2:当前栈S1内情况如图2:系统要启动Activity的实例 C在栈S1中。则系统首先会找到栈S1,然后再在栈中寻找Activity的实例C,C不存在则创建C的实例并压入栈中(图3)。

例3:当前栈S1内情况如图4:系统要启动Activity的实例 C在栈S1中。则系统首先会找到栈S1,然后再在栈中寻找Activity的实例C,C在栈S1中,则调用C的实例到栈顶(图5)。

1.4、singleInstance(单例模式)

    在这种模式下的Activity只能单独的运行在一个任务栈中。而且具有所有SingleTask模式的特性。也就是系统要启动A则会首先创建一个任务栈然后将A压入栈。

2、Activity 启动模式相关设置

 我在前面多次提到Activity的任务栈,用TaskAffinity这个参数来设置,这个参数用于表示一个Activity所需任务栈的名字,默认情况下所有Activity所需任务栈的名字为其包名。

给Activity指定启动模式有以下两种方法:

1、在AndroidMenifest.xml中设置

2、通过Intent中设置标志位
Intent intent = new Intent(MainActivity.this,MyActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);
其中标志Flags有:

FLAG_ACTIVITY_NEW_TASK、

FLAG_ACTIVITY_SINGLE_OP
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

你可能感兴趣的文章
C# 视频监控系列 序 [完]
查看>>
Asp.Net知识锦分享
查看>>
SQL Server 2014新特性:分区索引重建
查看>>
关于如何获取WebService中返回的DataTable
查看>>
Kibana + ElasticSearch + Logstash + Redis on RHEL 6
查看>>
MySQL深入08-日志及其参数设定
查看>>
[cocos2d-x]SpaceFighting[安卓/IOS都适用]
查看>>
【一天一个shell命令】文本内容操作系列-sed-简介
查看>>
创建第一个 local network(II)- 每天5分钟玩转 OpenStack(81)
查看>>
dg rman
查看>>
统计学生信息(使用链表完成)
查看>>
Exchange ActiveSync 配置
查看>>
让 SCOM 2007 R2 使用 SQL Server 2008 R2 数据库
查看>>
谈中型项目下的编码技巧一
查看>>
CentOS7下-bash: nano: command not found
查看>>
Ubuntu GNOME Power Manager 无法启动
查看>>
重新启用的邮箱账户发送邮件退信解决
查看>>
利用AX产品提升DNS服务器可用性和安全性的一种有效解决方案
查看>>
镭速RaySync VS FTP 系列(2) - 阿里云东京到阿里云深圳
查看>>
Rails开发细节《九》Rails的测试
查看>>