【一】Activity的生命周期,你真的了解了吗?

1.Activity生命周期的全面分析

本文将Activity的生命周期分为两部分内容。一部分是正常情况下的生命周期,另一部分是异常情况下的生命周期。正常情况下的生命周期指的是Activity在用户的参与中所经历的的生命周期;而异常情况下的生命周期指的是Activity被系统回收,或者当前设备的Configurarion发生变化从而导致了Activity的销毁和重建带来的Activity生命周期的变化。正常情况下与异常情况下Activity的生命周期关注点稍有不同,下面将分别从这两种情况进行介绍:

1.1正常情况下Activity的生命周期

正常情况下Activity会经历如下声明周期
(1)onCreate
表示Activity正在被创建,这是Activity生命周期中的第一个方法,在这个方法中我们可以去进行一些初始化的工作,比如加载布局setContentView,初始化一些数据initData(),即 一个新的Activity被创建的时候,会执行该方法,并且在生命周期中,该方法只会被执行一次。
(2)onRestart
表示Activity正在重新启动,可以理解为一个Activity由不可见状态重新变为可见状态,一般这种情况下由用户操作导致。比如:当用户在当前的Activity按了Home键,或者打开了一个新的Activity这个时候当前Activity调用了onPasue和onStop方法,变为了不可见的状态。当用户从桌面打开应用重新回到该Activity或者在新的Activiity按了返回键回到了该Activity,这个时候该Activity调用了onRestart和onResume方法,调用onRestart使得Activity重新变为可见的状态,但是还未显示在前台,还不能和用户进行交互。调用onResume方法后使得Activity显示到前台,这个时候Activity可以和用户进行交互。
(3)onStart
表示Activity正在被启动,该方法执行在onCreate方法之后,从语义上和onRestart对比可以得知,一个是正在被启动,一个是重新被启动,启动后,Activity都是可见的状态,但是还未显示到前台,不能和用户进行交互。
(4)onResume
表示Activity已经可见了,并且显示在前台开始活动,在这里要注意的一点就是和onStart,onRestart的对比,onResume表示Activtity可见,并且显示到了前台可以和用户进行交互,而onStart与onRestart虽然可见,但是还未展示到前台,还不能和用户进行交互。
(5)onPause
表示Activity正在被停止,正常情况下紧接着会执行onStop方法,Activity由可见状态变为不可见状态,比如:用户在当前的Activity启动一个新的Activity或者按Home键回到桌面,该Activity的onPause方法会执行,此时可以做一些数据存储,停止动画的工作,但是注意不能太耗时,因为会影响到新的Activity的显示,onPause必须执行完,新的Activity的onResume才会被执行。可以理解为必须使得当前Activity展示到后台,才能让新的Activity展示到前台。
(6)onStop
表示Activity即将停止,此时Activity还存在,但是不可见了
(7)onDestroy
表示Acitvity即将被销毁,该方法是Activity生命周期中的最后第一个方法,这个时候可以做一些回收和最终资源的释放工作。
正常情况下,Activity会经历以上7个生命周期。下面用一张图来描述Activtiy的切换过程




对于上图的描述,下面将提一些需要注意的地方:
(1)Activity A第一次启动,调用onCreate、onStart、onResume
(2)Activity A 启动Activity B的时候,A会调用onPause 然后B调用onCreate、onStart、onResume 最后A调用onStop。在这里需要注意的是,如果A是透明的主题,A最后不用调用onStop
(3)再次回到Activity A  A 会调用onRestart、onStart、onResume
(4)用户按下返回键 onPause、onStop、onDestroy

1.2异常情况下Activity的生命周期

在上面我们介绍了用户在正常情况下操作Activity的生命周期。接着我们就来介绍一下异常情况下Activity的生命周期的变化。我们知道当资源相关的系统配置发生变化,或者内存不足会导致Activity被杀死,下面我们就来介绍下面这两种情况:
1.2.1资源相关的系统配置发生变化导致Activity被杀死和重建
举个简单的例子,就用图片来说,我们为了兼容不同的设备,会在不同的drawable目录存放图片,这个时候我们进行切换横竖屏,就会导致系统配置发送了变化,从而导致了Activity被销毁和重建的过程。由于Activity被销毁,onPause、onStop、onDestroy均被调用。但是由于Activity是在异常情况下被杀死的,所以系统会调用onSaveInstanceState来保存当前Activity的状态。onSaveInstanceState必须执行在onStop方法之前。当Activity被重新创建的时候,系统会调用onRestoreInstanceState方法,并且把销毁的时候onSaveInstanceState保存的Bundle对象传递到onRestoreInstanceState和onCreate方法中,我们可以根据onRestoreInstanceState和onCreate中传递的Bundle参数来判断Activity是否是重建的,如果是,则取出数据进行恢复。需要注意的是,onRestoreInstanceState执行在onStart之后。
在这我们可能比较疑问,系统保存和恢复的是那些数据?当Activity需要重建的时候,系统会自动为我们保存Activity的View的结构,并且在重新创建的时候自动恢复这些数据,比如用户输入的数据,ListView滑动位置,View的选中状态等等。
关于保存和恢复View的层次结构,系统的工作流程是这样的:首先Activity被意外终止的时候,Activity会调用onSaveInstanceState进行保存数据,然后Activity委托window去保存数据,接着window委托顶层容器保存数据,顶层容器是一个viewGroup,一般很可能是DecorView。最后顶层容器在一一的通知它的子元素来保存数据,这样整个数据保存过程就完成了。
1.2.2资源内存不足导致低优先级Activity被杀死
Activity按照优先级别高到低排序,一般情况下会分为如下三种:
(1)正在和用户交互的Activity
(2)可见但是不能交互的Activity比如对话框之后的Activity
(3)后台Activity,已经被停止了的Activity,执行了onStop之后的Activity
当系统内存不足的时候,就会杀死优先级低的Activity所在进程,然后调用onSaveInstanceState和onSaveInstanceState进行数据的存储恢复操作。同时我们也知道,当进程中没有运行有四大组件,该进程很容易被杀死,因此后台工作进程为了不容易被杀死,比较好的方法就是将该工作运行在Service中,保证了进程有一定的优先级,从而不容易被杀死。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值