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中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...
随机推荐
- 【代码笔记】Web-HTML-基础
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- css3 Box model 与 Box-sizing
1.Box Model(盒模型) CSS中的Box Model分为两种:第一种是W3C的标准模型,另一种是IE的传统模型.它们的相同之处是对元素的width.height.padding.border ...
- mysql之Query Cache
1,QueryCache的实现原理: 1.目前只有select语句会被cache,其他类似show,use的语句则不会被cache. 2.两个SQL语句,只要相差哪怕是一个字符(例如大小写不一样:多一 ...
- [20180503]珅与分隔符.txt
[20180503]珅与分隔符.txt --//今天再次遇到分隔符问题,以前也遇到过做一次,链接.http://blog.itpub.net/267265/viewspace-763696/--//这 ...
- 洗礼灵魂,修炼python(56)--爬虫篇—知识补充—编码之url编码
其实在最前面的某一篇博文里,是绝对提过编码的,有ASCII,有UTF-8,有GB2312等等,这些我绝对说过的. url编码 首先,Http协议中参数的传输是"key=value" ...
- jquery常用表单操作
//js将表单序列化成对象 $.fn.serializeObject = function () { var $els = $(this).find("[name]"); var ...
- SQL Server 将一个表中字段的值复制到另一个表的字段中
具体方法如下 一:update 表2 set (要插入的列名)= select 表1.某一列 from 表1 left jion 表2 on 表1和表2的关联 where ..... 二:update ...
- webservice偶尔报黄页,解决方案
在system.web节点里加以下代码 <webServices> <protocols> <add name="HttpSoa ...
- Zabbix3.x 监控磁盘IO与自定义模板
引言 Zabbix自带的模板,帮助我们完成了一些比较常用的监控.但如果想要监控磁盘的IO,zabbix并没有给我们提供这么一个模板,所以我们需要自己来创建一个模板来完成磁盘IO的监控. 操作步骤 1. ...
- Linux 小知识翻译 - 「小型移动式PC」
这次介绍下新闻上提到的「小型移动式PC」.(这个当时日本新闻上的内容) 最近,经常在日本的大卖场中看到一种小型的移动式PC.不仅是小巧方便携带,而且价格也便宜.而且,省电功能的加入,使电池能工作更长的 ...