16.Android-activity生命周期与启动模式
1.activity共有4个状态
如下图所示:
运行状态
如果一个活动位于屏幕的前台(可见的),那么它就是活动的或正在运行的。
暂停状态
如果一个活动失去了焦点,但仍然可见(也就是说,一个新的非全尺寸或透明的活动将焦点放在了活动的顶部),那么它将被暂停。暂停的活动是完全活动的(它维护所有状态和成员信息,并保持与窗口管理器的连接),但是在内存极低的情况下,系统可能会终止它。
比如:当前APP出现一个非全尺寸的对话框
停止状态
如果一个活动完全被另一个活动遮挡住了,它就会被停止。它仍然保留所有的状态和成员信息,但是,它对用户来说不再可见,所以它的窗口是隐藏的,当在其他地方需要内存时,会被系统杀死。
比如:APP在后台运行
销毁状态
activity被系统杀死或者调用finish方法主动退出
可以重写的方法有:
- onStart() : 当onCreate()之后,会调用该方法
- onResume() : 当onStart ()之后或者取消暂停后,会调用该方法
- onRestart() : 当取消停止后,会调用该方法
- onPause() : 当另个非全尺寸或透明的活动将焦点放在了活动的顶部,那么该活动就会进入暂停状态,然后调用该方法
- onStop() : 当前活动被另个活动完全覆盖后(比如有人打电话过来),那么该活动就会进入停止状态,然后调用该方法,一般在这个方法中停止所有关于刷新界面的操作.
- onDestroy() : activity被系统杀死或者调用finish方法主动退出,那么会调用该方法, 一般在这个方法中用于释放资源,
2.activity启动模式
在Android开发中,如果我们通过一个按钮重复打开5个相同的activity的话, 系统就会创建多个实例并把它们放入任务栈中,然后我们点击返回键时,当前正在显示的activity(栈顶的实例)则会出栈,然后显示之前入栈的实例,要退出的话,必须也要点击5个相同的返回键. 这样其实非常耗资源,并且每个相同的activity都是独立的实例(数据分开的),会给用户带来困扰,为了了解决这一问题,Android为Actiivty提供了启动模式launchMode
启动模式launchMode
Activity的启动模式有四种:standard(系统默认的模式)、singleTop、singleTask和singleInstance,如下图所示:
2.1 standard标准模式
系统默认的模式,配置该模式的activity不管在任务栈中是否已存在,都会创建出来.
比如:我们通过一个按钮重复打开5个相同的activity的话,那么退出的话,必须也要点击5个相同的返回键.因为每个相同的activity都是独立的.
Manifest中配置如下:
android:launchMode=”standard” //可以不写,因为默认就是standard模式。
2.2 singleTop栈顶单独模式
在栈顶只能拥有唯一的实例,使用该模式的话,如果当前要启动的activity是栈顶的activity,那么就不会被创建,并且不发生任何变化.
比如:我们在当前MainActivity中通过按钮重复打开第二个MainActivity,系统就会检测到当前栈顶正在运行的activity实例等于要打开的activity实例,就不会创建实例.
如果我们打开的顺序是MainActivity->SecondActivity->MainActivity(栈顶,当前正在显示的界面),则这3个实例会正常的创建出来.
Manifest中配置如下:
android:launchMode=" singleTop"
用于该模式的常见activity比如有: 二维码扫码界面activity(避免打开多个相同界面)
2.3 singleTask单独实例模式
在栈中只能拥有唯一实例,创建使用该模式的activity的实例之前,会自动在任务栈中匹配实例,如果之前未创建,那么就在栈顶创建一个实例,如果已存在,那么会将它上面的其它所有activity全部出栈, 然后显示当前已经创建的activity,并且会回调该实例的onNewIntent()方法。
比如:
我们设置MainActivity为singleTask模式
SecondActivity为standard默认模式
然后打开的顺序是MainActivity->SecondActivity->SecondActivity->SecondActivity(栈顶,当前正在显示的界面)。
接下来我们再次打开MainActivity,由于MainActivity为singleTask,那么系统就会将它上面的其它所有activity全部出栈,所以就变成了: MainActivity(栈顶,当前正在显示的界面),这时点击返回键的话,那么就直接退出到桌面了.
Manifest中配置如下:
android:launchMode="singleTask"
用于该模式的常见activity比如有:主界面activity
2.4 singleInstance单例模式
该模式比较特殊,创建使用该模式的activity的实例会自动占用一个独立任务栈, 具有全局唯一性,如果我们要创建的activity已存在,那么就会显示当前已经创建的activity.
比如:
我们设置MainActivity为standard默认模式、SecondActivity为singleInstance模式
然后打开的顺序是MainActivity->SecondActivity (栈顶,当前正在显示的界面)。
接下来我们再次打开MainActivity,由于MainActivity和SecondActivity是分开的任务栈,所以这次激活的是MainActivity所在的任务栈,那么SecondActivity独立任务栈就会被压在最下面,所以就变成了:
SecondActivity-> MainActivity (最开始的界面)-> MainActivity (栈顶,当前正在显示的界面).
Manifest中配置如下:
android:launchMode="singleInstance"
用于该模式的常见activity比如有:浏览器界面activity(任何界面都可以去调用它访问网页)
最新文章
- DataGridView 在下拉框添加下来事件
- IE8+兼容经验小结
- CSS3新增属性
- 绘制图形与3D增强技巧(一)----点图元
- django views中提示cannot convert dictionary update sequence element #0 to a sequence错误
- leetcode:String to Integer (atoi)
- cocos2d-x 2.2 资源更新AssetsManager例子代码
- 理解Android的手势识别
- 一位ACM过来人的心得
- C语言陷阱:浮点运算
- USACO Section 2.1 Healthy Holsteins
- [JAVA] TicTacToe实现Socket通信(一)
- git使用手册整理
- Oracle中connect by用法示例
- 申请ssl证书报提示caa提示
- [转载]设置Chrome忽略网站证书错误
- Linux定时任务工具crontab详解及系统时间同步
- PostgreSQL高可用集群方案收集/主从切换/一主多从(待实践)
- Python 连接 Oracle数据库
- Java多线程一些基础知识
热门文章
- 09_Python语法示例(数据类型)
- weekly-contest-205
- 使用Azure DevOps Pipeline实现.Net Core程序的CD
- 一文说清 InnoDB 的事务机制
- jenkins打包java项目缺少jar包问题解决
- JS语法_类型
- 备忘录:SQL SERVER2014 出现:“Cannot find one or more components”
- Linux打包压缩解压工具
- 解决spark streaming集成kafka时只能读topic的其中一个分区数据的问题
- 学习 | iscroll之上拉加载下拉刷新