大家好,我是本期栏目编辑小友,现在为大家讲解一文读懂Android Activity生命周期问题。
一、正常情况下活动的生命周期:
ActIon的生命周期可以大致分为三个部分。
onCreate()的整个生命周期可以设置所有“全局”状态,onDestory()可以释放所有资源。
可见生命周期:onStart()向用户显示的UI数据和资源等。当onStop()不再需要显示时,可以释放资源。
前台的生命周期:此生命周期处于活动状态,onResume()返回前台,onPause()不可见或被覆盖。
不要在onCreate()方法中执行耗时的操作,也不要在onStart()和onResume()中做太多操作,否则桌面应用图标会卡住。
(1)onCreate:表示正在创建活动。您可以调用setContentView来加载布局资源、初始化各种控件、设置监听以及初始化一些全局变量。因为onCreate方法在活动的生命周期中只会执行一次。在暂停和停止状态下恢复或重新启动时,这些控件、监视器和全局变量不会丢失。即使内存不够,也会回收,如果再次回收,则是新生命周期的开始,将再次执行Recreate方法。
(2)启动:表示活动正在重新启动。当处于非堆栈顶部状态的活动需要再次返回堆栈顶部并向用户显示时,会触发此方法。调用场景主要包括:在home键后,再切换回来,在Activity跳转到另一个Activity后,按back键返回原来的Activity。很少调用,因为只能在onStop之后调用,所以最好把操作放在onStart方法中。
(3)onStart:表示Activity正在启动,此时Activity已经可见,但尚未出现在前台,无法与用户进行交互。
(4)onResume:表示活动已经可见,出现在前台,开始活动。
(5)onPause:表示活动正在停止。在正常情况下,onStop会被调用,但是透明的Activity会被打开,onStop不会被调用,onResume返回时会被调用。可以执行一些轻量级的发布工作(时间消耗会影响新活动的显示,新活动的生命周期要等到onPause完成后才会执行),比如停止动画、取消广播接收器等。
(6)onStop:表示活动将停止,可能会被系统回收。在某些极端情况下,系统可能会直接杀死应用程序进程,而不是调用onDestory方法,因此我们需要在onStop方法中尽可能多地释放用户暂时不需要使用的资源,以防止内存泄漏。可以做一些稍微重量级的回收工作,比如:数据保存,需要用到的数据库操作。
(7)on description:表示活动将被销毁,要判断是否有一些资源没有被释放,还要做一些最后的清理工作,比如在这个活动的onCreate中打开了一个线程,那么就要判断它在on description中是否结束,如果没有,就结束它。
几个生命周期过程的情况:
(1)现在有两个Activity,A和B,重写了所有的生命周期方法。
输入,回调:aoon create aoon create-aoon start-aoon resume。回到桌面:AAonPause - AonStop。
点击按钮进入B,回调:a暂停-boncreate-bonstart-bonresume-a stop。
按回车键回电:bon暂停-a重启-a启动-a恢复-bon停止-bon存储。
(2)启动对话式活动,有两个活动。
vity,A 和B(对话框式Activity)。从A进入B,回调:AonPause-->BonCreate-->BonStart-->BonResume ,并不会调用onStop。
按下back键,BonPause-->AonRestart-->AonStart-->AonResume-->BonStop-->BonDestory回调:BonPause-->AonResume-->BonStop-->BonDestory。
启动对话框并不会有生命周期的变化,这里启动的是透明主题的Activity。
二、关于SaveStateInstance
系统配置发生改变后或内存瓶颈时,生命周期发生异常,会调用onSaveInstanceState和onRestoreInstanceState这两兄弟,这就很好的解决Android应用的内存问题。
旋转屏幕时,生命周期大概如下图(若不想,可在清单文件设置android:configChanges="orientation|keyboardHidden|locale"):
onSaveInstanceState:在Activity(onStop之前)被回收之前,系统会调用onSaveInstanceState(Bundle outState)来保存View的状态,并到传入的outState对象中。
onRestoreInstanceState:在Activity被重新创建时,会通过onCreate(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)传入保存的状态信息并恢复View的状态。(onCreate主要重建Fragment、onRestoreInstanceState恢复Window状态)
View控件的状态被保存需要满足两个条件:
1、View有唯一的ID; 2、View的初始化时要调用setSaveEnabled(true)
View控件恢复的注意三点:
1、如果id重复,则View的状态会被覆盖
2、被保存的Fragment会在onCreate中被自动创建和添加到FragmentActivity中
3、被保存的View不会被自动创建,只是通过id获取savedInstance用于更新View
一、正常情况下AcTIvity的生命周期:
AcTIvity的生命周期大概可以归为三部分
整个的生命周期:onCreate()可以设置所有的“全局”状态, onDestory()可以释放所有的资源
可见的生命周期:onStart()显示给用户的UI数据和资源等, onStop()当不再需要显示时候,可以释放资源
前台的生命周期:该生命周期活跃,onResume()回到前台,onPause()不可见状态或被覆盖
不要在onCreate()方法中执行耗时的操作,onStart()及onResume()不可进行过多操作,不然打开桌面应用图标会卡顿。
(1)onCreate:表示AcTIvity正在被创建。可以调用setContentView加载布局资源、初始化各控件、设置监听、并初始化一些全局的变量。因为在AcTIvity的一次生命周期中,onCreate方法只会执行一次。在Paused和Stopped状态下恢复或重启的下,这些控件、监听和全局变量也不会丢失。即便是内存不足,被回收了,再次Recreate的话,又是一次新的生命周期的开始,又会执行onCreate方法。
(2)onRestart:表示Activity正在重新启动。当处于非栈顶状态的活动需要再次返回栈顶,展现给用户的时候,触发该方法。调用的场景主要有:home键之后,然后切换回来、Activity跳转到另一个Activity之后,按back键返回原来Activity。很少调用,因为它只在onStop之后才可能调用,所以操作放在onStart方法里面就比较好。
(3)onStart:表示Activity正在启动,这时Activity已经可见,但是还没有出现在前台,还无法和用户交互。
(4)onResume:表示Activity已经可见了,并且出现在前台并开始活动。
(5)onPause:表示Activity正在停止,正常情况下,onStop会接着调用,但是打开的是透明的Activity,不会调用onStop,返回会调用onResume。可以执行一些轻量级的释放工作(耗时会影响到新的Activity显示,onPause必须执行完,新Activity的生命周期才会执行)例如:停止动画、取消broadcast receivers等。
(6)onStop:表示Activity将要停止,极有可能被系统所回收,在某些极端情况下,系统可能是直接杀死应用程序的进程,而不是调用onDestory方法,所以我们需要在onStop方法中尽可能的释放那些用户暂时不需要使用的资源,防止内存泄露。可以做一些稍微重量级的回收工作,例如:数据保存,需要用到的数据库操作。
(7)onDestory:表示Activity将被销毁,确定某些资源是否没有被释放,做一些最终的清理工作,比如在这个Activity的onCreate中开启的某个线程,那么就要在onDestory中确定它是否结束了,如果没有,就结束它。
几种生命周期流程的情况:
(1)现在有两个Activity,A 和B,都重写了所有的生命周期方法。
进入A,回调:AonCreate-->AonStart-->AonResume。返回桌面:AAonPause-->AonStop。
点击按钮进入B,回调:AonPause-->BonCreate-->BonStart-->BonResume-->AonStop。
按下back键,回调:BonPause-->AonRestart-->AonStart-->AonResume-->BonStop-->BonDestory
(2)启动对话框样式的Activity,有两个Activity,A 和B(对话框式Activity)。
从A进入B,回调:AonPause-->BonCreate-->BonStart-->BonResume ,并不会调用onStop。
按下back键,BonPause-->AonRestart-->AonStart-->AonResume-->BonStop-->BonDestory回调:BonPause-->AonResume-->BonStop-->BonDestory。
启动对话框并不会有生命周期的变化,这里启动的是透明主题的Activity。
二、关于SaveStateInstance
系统配置发生改变后或内存瓶颈时,生命周期发生异常,会调用onSaveInstanceState和onRestoreInstanceState这两兄弟,这就很好的解决Android应用的内存问题。
旋转屏幕时,生命周期大概如下图(若不想,可在清单文件设置android:configChanges="orientation|keyboardHidden|locale"):
onSaveInstanceState:在Activity(onStop之前)被回收之前,系统会调用onSaveInstanceState(Bundle outState)来保存View的状态,并到传入的outState对象中。
onRestoreInstanceState:在Activity被重新创建时,会通过onCreate(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)传入保存的状态信息并恢复View的状态。(onCreate主要重建Fragment、onRestoreInstanceState恢复Window状态)
View控件的状态被保存需要满足两个条件:
1、View有唯一的ID; 2、View的初始化时要调用setSaveEnabled(true)
View控件恢复的注意三点:
1、如果id重复,则View的状态会被覆盖
2、被保存的Fragment会在onCreate中被自动创建和添加到FragmentActivity中
3、被保存的View不会被自动创建,只是通过id获取savedInstance用于更新View
技术专区 一种非常实用的系统掉电检测和保护电路 面向AWorks框架时间管理程序设计 嵌入式系统分析工具 RX200系列可实现电源效率和高性能的最佳平衡 从零开始学习用Python构建神经网络