Activity中 onResume和onPause与onStart()和onStop()的一些思考

也许你会遇到这种问题:

如果一个Activity在用户可见时才处理某个广播,不可见时注销掉,那么应该在哪两个生命周期的回调方法去注册和注销BroadcastReceiver呢?
下面见答案。


首先你要首先了解Activity的四种状态

① Active/Runing 一个新 Activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态

② Paused 当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互

③ oped 当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于 Stoped 状态

④ Killed Activity 被系统杀死回收或者没有被启动时处于 Killed 状态


再来看一下Activity生命周期中的这4个方法:

①onStart():

 此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见摆了。 


②onResume():

当此方法回调时,则说明Activity已在前台可见,可与用户交互了(处于前面所说的Active/Running形态),onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是后台无法与用户交互,而onResume则已显示在前台,可与用户交互。当然从流程图,我们也可以看出当Activity停止后(onPause方法和onStop方法被调用),重新回到前台时也会调用onResume方法,因此我们也可以在onResume方法中初始化一些资源,比如重新初始化在onPause或者onStop方法中释放的资源。 


③onPause(): 

此方法被回调时则表示Activity正在停止(Paused形态),一般情况下onStop方法会紧接着被回调。但通过流程图我们还可以看到一种情况是onPause方法执行后直接执行了onResume方法,这属于比较极端的现象了,这可能是用户操作使当前Activity退居后台后又迅速地再回到到当前的Activity,此时onResume方法就会被回调。当然,在onPause方法中我们可以做一些数据存储或者动画停止或者资源回收的操作,但是不能太耗时,因为这可能会影响到新的Activity的显示——onPause方法执行完成后,新Activity的onResume方法才会被执行。


④onStop():

一般在onPause方法执行完成直接执行,表示Activity即将停止或者完全被覆盖(Stopped形态),此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作(不能太耗时)


上面问题的结果:

Activity 的可见生命周期发生在 onStart调用与 onStop调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互(???)。我们可以在 onStart中注册一个 BroadcastReceiver以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop中将其取消注册。


至于为什么不是回答在onResume和onPause方法中???

>>>、onStart方法是activity一创建就会执行,onResume方法在onStart方法之后执行。

>>>、当某个activity没有被销毁而重新获取屏幕焦点的时候会执行onResume方法而不会再执行onStart方法了!

>>>、比如,当你手机长时间不操作灭屏以后,再次打开的时候由于activity没有被销毁就会执行onResume方法,而不是执行onStart方法!

(即在activity生命周期中,onstart只执行一次,而onresume方法可能会执行多次)

如下是形象过程图:

onCreat() -> onStart() -> [可见不可操作] -> onResume() -> [可操作] -> onPause() -> [可见不可操作] -> onStop() -> [不可见] -> onDestroy() -> [销毁]


那么onStart()和onResume()的区别:

1)、onStart()是activity界面被显示出来的时候执行的,用户可见,包括有一个activity在他上面,但没有将它完全覆盖,用户可以看到部分activity但不能与它交互!!!
2)、onResume()是当该activity与用户能进行交互时被执行,用户可以获得activity的焦点,能够与用户交互!!!

3)、onStart()通常就是onStop()(也就是用户按下了home键,activity变为后台后),之后用户再切换回这个activity就会调用onRestart()而后调用onStart()
4)、onResume()是onPause()(通常是当前的acitivty被暂停了,比如被另一个透明或者Dialog样式的Activity覆盖了),之后dialog取消,activity回到可交互状态,调用onResume()。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu16.04安装搜狗输入法后有黑边问题的解决方法

apt-get install compton compton -b 转载于:https://www.cnblogs.com/xiaoyafei/p/8383678.html

glyphicons 图标大全

http://www.runoob.com/bootstrap/bootstrap-glyphicons.html

java打印运行时间

// 放在要检测的代码段前,取开始前的时间戳 Long startTime System.currentTimeMillis(); // 放在要检测的代码段后,取结束后的时间戳 Long endTime System.currentTimeMillis();// 计算并打印耗时 Long tempTime (endTime - startTime); System.out.…

工作222:title写活

<el-dialog:title"fullTitle":visible.sync"dialogFormVisible"close"close">

Java_WEB项目OOM(OutOfMemError内存溢出) MyEclipse配置Jvm内存

前言 刚刚接触的项目是基于SSM&#xff0c;但Tomcat启动时默认的64M内存就总显得不太够。程序运行过程中经常出现OOM(OutOfMemError)。 措施 搜索网上的解决方案&#xff0c;还是比较好解决的&#xff0c;需要给MyEclipse设置Jvm内存大小(即设置Tomcat的Jvm内存大小) : Win…

net.sf.ezmorph.Morpher问题解决

运行web项目&#xff0c;外部访问Servlet报错 报错如下&#xff1a; nested exception is java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher 找不到这个类&#xff1a;net.sf.ezmorph.Morpher 解决方法&#xff1a;复制这些servlet必要的jar包到WEB-INF文件夹下lib文…

记录自己灵感闪现的开发语录 每日更新 记录变强或者变得更菜的过程

坚持第1天 2018年8月5日 今日博客排名115万 1、大多数人不想成为菜鸟&#xff0c;但现实是大多数人是菜鸟&#xff0c;包括我。 坚持第2天 2018年8月6日 今日博客排名115万 1、听别人说&#xff1a;“大多数人吃得了生活的苦&#xff0c;却吃不了学习的苦”。而我现在&#xff…

工作223:状态管理里面取值

第一步 computed 第二步 取值 computed: {/*GY5 控制新增标题的显隐*/fullTitle() {return this.title "用户";},DepartmentId(){return this.$store.state.department.id},Property(){return this.$store.state.department.property}},created() {/*第二步*/ge…

jsp自定义alert

普通alert alert(data.msg); 自定义alert 1、创建弹出框div <!--弹出框---------------------------> <div id"alert_div" align"center"> <div align"left">操作提示</div> …

C语言实现排名算法和排位算法

1 #include "stdio.h"2 int search_second_max(int array[], int n,int m)3 {4 int max1;5 int i,num;6 num1;//默认第一名 7 if(m>n) return 0; 8 max1 array[m];9 for (i 0; i < n; i)10 {11 if (array[i]&g…

jeesite导出Excel Minimum column number is 0

问题今天在用jeesite(poi)做导出的时候遇到一些问题&#xff01;记录一下.java.lang.IllegalArgumentException: Minimum column number is 0 at org.apache.poi.ss.util.CellRangeAddressBase.validateColumn(CellRangeAddressBase.java:73) at org.apache.poi.ss.util.CellRa…

工作224:当前函数造成

这种报错一般是当前页面的create函数造成的

jQuery基础,javascript

1、获取标签id赋值 $("#data1").text("fwefewfewfwe"); 2、获取表单输入值 var data $("#myForm").serialize(); <input name"username" /></td> <input name"password" type"password"/&g…

在VirtualBox中安装BlackArch Linux

作者&#xff1a;荒原之梦安装前的准备 下载系统映像&#xff1a;BlackArch Linux官网下载页面 在本文中我使用的是BlackArch Linux的Live ISO&#xff0c;这样可以减少安装时下载系统的时间。BlackArch的Live ISO文件有7.5G&#xff0c;我们可以使用BT种子来下载&#xff0c;这…

工作225:当前导致name报错

<!-- <el-form ref"form" :model"form" size"medium" :label-width"formLabelWidth" v-loading"loading"><el-form-item label"订单名称" ><el-input v-model"form.order.name" :dis…

Maven的安装以及在Myeclipse上的配置——超详细

在网上找了配置maven的文章&#xff0c;感觉还是有点图文会比较方便查看。 一&#xff1a;Maven的下载安装 准备工作&#xff1a; 1)安装环境 Windows 7 2)需安装JDK ,并配置环境变量(略) 3) Maven版本3.0.5 4)下载地址:http://mirror.bit.edu.cn/apache/maven/maven-3/3.0.5/b…

myeclipse中如何在整个工程中搜索字符串

看图点击即可。项目——>Search——>File 选择搜索条件

十五. Python基础(15)--内置函数-1

十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os import in code ① eval : 有返回值, 适用于执行计算语句, 例如eval("43"). ② exec : 没有返回值, 适用于执行流程控制语句, 例如exec(a b if b&…

工作226:for循环逻辑

<el-form v-for"(cep,index) in form.detpartment_amount" ><el-form-item label"部门账号"><el-input v-model"cep.name"></el-input></el-form-item><el-form-item label"传播量"><el-inpu…

myeclipse中添加Oracle数据库

打开Myeclipse后点击如图右上方进入MyEclipse Database Explorer视图 在如图空白处鼠标右击后点选new进入Create a new connection driver界面 在Driver template:中下拉选中Oracle(Thin driver); 在Driver name中填写你希望的名称&#xff1b; 在Connection URL中将后面…