Android学习之基础知识四-Activity活动7讲(活动的启动模式)
在实际的项目开发中,我们需要根据特定的需求为每个活动指定恰当的启动模式。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讲(活动的启动模式)的更多相关文章
- Android学习之基础知识四-Activity活动6讲(体验Activity的生命周期)
一.体验活动的生命周期的执行 代码组成: 1.三个Java类:MainActivity.java.NormalActivity.java.DialogActivity.java 2.三个布局文件:ac ...
- Android学习之基础知识四-Activity活动5讲(Activity的生命周期)
一.返回栈 1.Android是通过任务(Task)来管理活动,一个任务就是一个返回栈内所有活动的集合. 2.返回栈是一个后进先出的数据结构,每启动一个新的活动,该活动就会覆盖原来的活动,位于栈顶位置 ...
- Android学习之基础知识四-Activity活动8讲(活动的灵活运用)
一.判断当前是在哪个活动 1.我们还是接着上一讲的代码,首先创建一个Java类:BaseActivity.java.这个类我们不作为一个活动,也不在AndroidManifest.xml中注册,它只是 ...
- Android学习之基础知识四-Activity活动4讲(Intent传递数据)
Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据. 一.使 ...
- Android学习之基础知识四-Activity活动3讲(Intent的使用)
主活动名称FirstActivity.java改为了MenuTest.java 一.什么是Intent: 1.Intent是Android程序中各组件之间进行交互的重要方式,不仅可以指明当前组件想要进 ...
- Android学习之基础知识四-Activity活动2讲
一.在活动(activity)中添加Toast显示: 1.Toast作用:Android系统提供的一种非常好的提醒方式,将一些短小的信息提供给用户,这些信息会在一段时间后自动消失,不会占用任何屏幕空间 ...
- Android学习之基础知识四-Activity活动1讲
一.活动(Activity)的基本用法: 1.手动创建活动FirstActivity(java源码): A.Android Studio在一个工作区间只允许打开一个项目,点击:File--->C ...
- Android学习之基础知识十六 — Android开发高级技巧的掌握
一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到C ...
- Android学习之基础知识十三 — 四大组件之服务详解第一讲
一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...
随机推荐
- APP如何进行通信的
什么是B/S架构(Browser/server):浏览器和服务器架构
- react的生命周期需要知道的。
有关React生命周期: 1.组件生命周期的执行次数是什么样子的??? 只执行一次: constructor.componentWillMount.componentDidMount 执行多次:ren ...
- nativefier(一行代码将任意网页转化为桌面应用)
刚刚在看前端九部的手册的时候,发现一个之前没有用过的骚东西,看上去还挺好用,我这个好奇心瞬间就窜的老高了,赶紧试一试,看看这个东西有没有必要收入我的胯下 结果实验完了之后, 必须必须要强行安利给你们 ...
- MySQL高可用方案--MHA原理
简介 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是日 ...
- loadrunner 运行场景-场景运行原理
运行场景-场景运行原理 by:授客 QQ:1033553122 运行原理 1 Remote Agent Dispatcher(Process) 运行Controller在负载机上开启应用程序. 2 ...
- LyX使用中的一些问题
编译开始产生的检查错误 试用LyX2.3,在2.15中能编译通过的文档,竟然提示错误 The user preamble of your document contains glyphs that a ...
- Dos烧录脚本
Dos命令之前更改的太简单,现在加入判断是否进入fasboot模式和判断Android镜像是否存在:代码已经尽量简化成这样,dos命令功能还是比较不好用的,用了一下午的时间... @echo off ...
- windows任务管理器怎么知道多个IIS网站进程分别对应哪个网站
摘要: 1.IIS网站对应的进程名一般叫w3wp.exe (windows2008系统为例,其他类似) 2.windows默认的任务管理器只能看到多个同名的进程名w3wp.exe,没法区别分别对应哪个 ...
- 通过logstash过滤、分析日志数据
logstash是怎么工作的呢? Logstash是一个开源的.服务端的数据处理pipeline(管道),它可以接收多个源的数据.然后对它们进行转换.最终将它们发送到指定类型的目的地.Logstash ...
- zk理解(转载自邬兴亮---www.cnblogs.com/wuxl360/p/5817471.html)
一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的 ...