在实际的项目开发中,我们需要根据特定的需求为每个活动指定恰当的启动模式。Activity的启动模式一共有4种:standard、singleTop、singleTask、singleInstance. 可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式

一、standard

  standard模式是活动默认的启动模式,在该模式下,每启动一个活动都会创建该活动的一个新的实例并放在栈顶的位置,而不在乎返回栈里面是否已经存在该活动。

standard模式的示意图:

Java代码:

效果:点击三次button1按钮,都会打开FirstActivity活动界面,查看Logcat日志,可以看到创建了三个FirstActivity活动的实例,退出该活动界面需要点击三次Back键才退出。

 二、singleTop

  singleTop启动模式的工作原理:当每次启动活动时,系统会先在返回栈中检查栈顶的活动是不是当前正在启动的活动,如果是当前正在启动的活动,那么就会直接使用栈顶的这个实例,不会再创建新的实例,如果不是当前正在启动的活动,那么才会创建一个新的活动实例。

  需要注意的是:如果栈内已经存在当前正在启动的活动,还是会重新创建一个新的活动实例。

singleTop模式的示意图:

情况一:正在创建的活动位于栈顶

Java代码:

修改AndroidManifest.xml中FirstActivity活动的启动模式:

运行程序:

在程序运行成功的时候,会创建一个FirstActivity活动的实例,然后我们点击button1,不管点击多少次,从Logcat日志中我们可以看到,除了刚开始运行程序的时候创建了一个实例外,没有再创建新的实例。

按Back键退出程序也只需要按一次Back键就行了。

情况二:返回栈内部存在当前正在启动的活动

两个活动:FirstActivity、SecondActivity

运行程序:因为启动了FirstActivity活动,所以此时只创建了一个FirstActivity活动的实例

点击button1按钮进入SecondActivity活动界面:创建了SecondActivity活动的实例

点击button2按钮,返回到FirstActivity活动界面:此时又创建了一个FirstActivity活动的实例。

经过 上面整个过程,返回栈中总共存在三个活动的实例,从栈底到栈顶依次是:FirstActivity--->SecondActivity--->FirstActivity

此时点击Back键,活动的运行顺序是:FirstActivity Back--->SecondActivity Back--->FirstActivity Back--->程序关闭

第一次点击Back:

第二次点击Back:

第三次点击Back:结束程序

三、singleTask

  singleTask启动模式:每次启动一个活动时,系统会先检查返回栈中是否存在该活动,如果存在该活动,那么就会直接使用该实例,不会再创建一个该活动的实例,并使该活动之上的所有活动都出栈。如果不存在该活动,那么就会创建一个新的活动实例。

singleTask模式示意图:

示例:

第一步:将FirstActivity活动的启动模式设为singleTask模式

第二步:在FirstActivity活动中添加onRestart()方法,并打印日志

第三步:在SecondActivity活动中添加onDestroy()方法,并打印日志

第四步:运行程序,进入FirstActivity活动--->点击button1按钮进入SecondActivity活动界面--->点击button2按钮返回到FirstActivity

第五步:看Logcat日志,从日志中可以看到,运行程序的时候,只创建了FirstActivity活动的一个实例,当启动SecondActivity活动时,又创建了SecondActivity活动的一个实例,此时两个实例在返回栈中的位置是:FirstActivity活动的实例在栈底,SecondActivity活动的实例在栈顶。当点击button2按钮启动FirstACtivity活动时,此时SecondActivity活动实例被移除栈顶,因此调用了SecondActivity活动的onDestroy()方法,而FirstActivity活动从栈底位置到了栈顶位置,这个时候并没有再创建FirstActivity活动的实例,只是重新返回到了该活动,从不可见变为了可见状态,因此此时FirstActivity是调用了onReStart()方法,而没有调用初始化方法onCreate()方法。

四、singleInstance

  场景:假设我们程序中的一个活动允许其他程序调用,如果我们想实现其他程序和我们的程序能够共享这个活动的实例,那么应该怎么实现呢?每个用于程序都有自己的返回栈,同一个活动在不同的返回栈中必然是创建了一个新的活动实例的,而我们共享的这个活动在一个返回栈中,共享同一个实例。

  singleInstance启动模式:singleInstance启动模式与其它三种启动模式不同,它是通过创建一个新的返回栈来管理活动的(如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈),在这种模式下,会有一个单独的返回栈来管理活动,不管哪个应用程序来访问这个活动,都共用同一个返回栈,也就解决了共享活动实例的问题。

singleInstance模式的示意图:

示例:

第一步:将SecondActivity活动的启动模式设置为singleInstance

第二步:创建活动后,打印出FirstActivity活动、SecondActivity活动、ThirdActivity活动所在的返回栈

第三步:运行程序,进入FirstActivity活动界面--->点击按钮,进入SecondActivity界面--->点击按钮进入ThirdACtivity界面,打开日志,从日志中我们可以发现FirstActivity活动与SecondActivity活动都在返回栈16中,而SecondActivity活动在返回栈17中,也就是说在启动SecondActivity活动的时候,系统重新创建了一个返回栈17专门来管理活动SecondActivity.

第四步:此时在ThirdActivity活动界面点击Back键,就会直接回到了FirstActivity活动界面,这是因为返回栈16是我们运行程序的返回栈,在这个返回栈中只有FirstActivity和ThirdActivity两个活动,FirstActivity活动位于栈底,ThirdActivity活动位于栈顶,当点击Back键时,ThirdActivity活动出栈,FirstActivity活动就位于栈顶位置了,所以此时显示的是FirstActivity活动,而不是SecondActivity活动,紧接着再点击Back键,FirstActivity活动出栈,这时候就返回到了SecondActivity活动的界面,这是因为返回栈16已经空了,只剩下返回栈17,而返回栈17中只有SecondActivity一个活动,因此显示的就是SecondActivity活动的界面,然后再点击Back键,系统退出。

五、活动启动模式总结

  1、standard:系统默认启动方式,所有活动在一个返回栈,每启动一个活动就会在返回栈的栈顶创建一个该活动的实例,与返回栈中有无该活动的实例无关。

  2、singleTop:所有活动都在一个返回栈,每启动一个活动,系统会先检查返回栈的栈顶的活动是不是当前启动的活动,如果是,就直接使用,如果不是,就会创建一个新的活动实例,与栈顶以下是否存在该活动实例无关。

  3、singleTask:所有活动都在一个返回栈,每启动一个活动,系统会先检查返回栈里面是否存在了该实例,如果存在,那么会把该实例上面的所有活动出栈,然后自己位于栈顶位置,如果不存在,那么会创建新的活动实例位于栈顶。(如果指定了不同的taskAffinity,也会启动一个新的返回栈)

  4、singleInstance:通过创建一个新的返回栈来管理活动,可以达到不同的应用程序共享同一个活动的目的。

Android学习之基础知识四-Activity活动7讲(活动的启动模式)的更多相关文章

  1. Android学习之基础知识四-Activity活动6讲(体验Activity的生命周期)

    一.体验活动的生命周期的执行 代码组成: 1.三个Java类:MainActivity.java.NormalActivity.java.DialogActivity.java 2.三个布局文件:ac ...

  2. Android学习之基础知识四-Activity活动5讲(Activity的生命周期)

    一.返回栈 1.Android是通过任务(Task)来管理活动,一个任务就是一个返回栈内所有活动的集合. 2.返回栈是一个后进先出的数据结构,每启动一个新的活动,该活动就会覆盖原来的活动,位于栈顶位置 ...

  3. Android学习之基础知识四-Activity活动8讲(活动的灵活运用)

    一.判断当前是在哪个活动 1.我们还是接着上一讲的代码,首先创建一个Java类:BaseActivity.java.这个类我们不作为一个活动,也不在AndroidManifest.xml中注册,它只是 ...

  4. Android学习之基础知识四-Activity活动4讲(Intent传递数据)

    Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据.  一.使 ...

  5. Android学习之基础知识四-Activity活动3讲(Intent的使用)

    主活动名称FirstActivity.java改为了MenuTest.java 一.什么是Intent: 1.Intent是Android程序中各组件之间进行交互的重要方式,不仅可以指明当前组件想要进 ...

  6. Android学习之基础知识四-Activity活动2讲

    一.在活动(activity)中添加Toast显示: 1.Toast作用:Android系统提供的一种非常好的提醒方式,将一些短小的信息提供给用户,这些信息会在一段时间后自动消失,不会占用任何屏幕空间 ...

  7. Android学习之基础知识四-Activity活动1讲

    一.活动(Activity)的基本用法: 1.手动创建活动FirstActivity(java源码): A.Android Studio在一个工作区间只允许打开一个项目,点击:File--->C ...

  8. Android学习之基础知识十六 — Android开发高级技巧的掌握

    一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到C ...

  9. Android学习之基础知识十三 — 四大组件之服务详解第一讲

    一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...

随机推荐

  1. spring boot (1):初尝

    工具:intellij idea 自定义banner: 控制台console显示的banner 自定义方式,在src/main/resources 下创建banner.txt增加文本即可,生成字符网站 ...

  2. Callable接口--有返回值的线程

    Callable java5之前是没有返回值的,Java5新增了Callable接口获得线程的返回值,可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.Cal ...

  3. python之线程相关操作(补充)

    1 线程的其他方法 import threading import time from threading import Thread, current_thread def f1(n): time. ...

  4. 【BI学习笔记】适合集成到项目里的BI:Wyn Enterprise

    近日,我收到葡萄城的邮件,讲葡萄城开始进军BI领域,发布了一套BI和报表工具,叫Wyn Enterprise. 之前了解过PowerBI等面向终端用户的BI工具,我发现BI工具与Wyn Enterpr ...

  5. (网页)js每隔5分钟执行一次ajax请求的实现方法(转)

    转自脚本之家: 一个页面好像只能有一个 window.onload=function(){},所以要有多个事件,这样写就好了 window.onload=function(){ //假设这里每个五分钟 ...

  6. zookeeper.Net

    原文转至:http://www.cnblogs.com/shanyou/p/3221990.html 之前整理过一篇文章<zookeeper 分布式锁服务>,本文介绍的 Zookeeper ...

  7. OneAPM大讲堂 | Metrics, Tracing 和 Logging 的关系

    [编者按]这是在 OpenTracing 和分布式追踪领域内广受欢迎的一片博客文章.在构建监控系统时,大家往往在这几个名词和方式之间纠结. 通过这篇文章,作者很好的阐述了分布式追踪.统计指标与日志之间 ...

  8. mysql 的一些事

    给mysql的root用户设置密码 1.刚安装好的mysql是没有设置密码的 2.设置密码 ****************************************************** ...

  9. 洗礼灵魂,修炼python(40)--面向对象编程(10)—定制魔法方法+time模块

    定制魔法方法 1.什么是定制魔法方法 首先定制是什么意思呢?其实就是自定义了,根据我们想要的要求来自定义.而在python中,其实那些所谓的内置函数,内置方法,内置属性之类的其实也是自定义出来的,不过 ...

  10. 洗礼灵魂,修炼python(34)--面向对象编程(4)—继承

    前面已经说到面向对象编程有封装,继承,多态三大特性,那么其中的继承则很重要,可以直接单独的拿出来解析 继承 1.什么是继承: 字面意是子女继承父母的家产或者特性等.而在编程里继承是指子类继承父类(基类 ...