背景
Android将所有的活动放在一个栈中管理,并且当前可视活动被放在栈的顶部。
在任何情况下,一个活动可以处于以下的四个状态:
1.Running 活动是可视的并可以和用户交互
2.Paused 活动依然可视但是不可以和用户进行交互
3.Stopped 活动不可视也不可和用户交互
4.killed 活动自动被系统清除(因为内存不足)或者方法finish()被调用
活动生命周期
以下的流程图反映了活动的一系列方法执行路径
以下是对图中方法的说明:
activity生命周期可分为两种,一种是正常情况下的生命周期
方法说明:
onCreate(Bundle saveInstanceState): 变量的初始化工作,设置layout
onRestart():activity由不可见(stop状态)重新变为可见状态时首先调用。
onStart():activity已经创建完成,但是界面还不可见,另外可以进行一些数据恢复工作
onResume() :与onStart除了界面可见与不可见的区别外没有什么不同
onPause():界面仍然可见但是不可交互,不推荐在onPause中进行耗时的工作,可以进行一些轻量级的存储数据等工作。
onStop():与onPause()除了可见与不可见的区别外没有什么不同,可以进行一些稍微重量级的回收工作。
onDestroy() 可以进行一些耗时的数据销毁工作,此方法调用后activity不复存在
一种是异常情况下的生命周期
情况一:系统配置发生改变导致activity被销毁
此时生命周期如下:
onPause()
onSaveInstanceState(Bundle saveInstanceState) 保存数据,如listview的position信息,textview的文本信息,每个view都要实现此方法
onStop()
onDestroy()
onCreate(Bundle saveInstanceState)
onStart()
onRestoreInstanceState(Bundle saveInstanceState)
恢复数据,每个view都要实现此方法
onResume()
常见的系统配置改变情况有这样几种:系统语言切换(locale),横竖屏切换(orientation),界面模式切换-如夜间模式切换(uiMode),调出键盘(keyboardHidden)
如果想要阻止activity的重新创建,需要在activity的属性里加上configChanges。
举个常见的例子:configChanges=”local|orientation|uiMode|keyboardHidden” ,这样,上面的四种情况(本地语言改变|切换横竖屏|界面模式改变(比如开启夜间模式,API 8新加入|键盘可访问性改变(调出关闭键盘等))发生就不会重新创建activity了
情况二:系统内存不足导致activity被销毁
这个情况生命周期与情况一一致
activity的优先级:当前activity(前台)> 半透明activity(Pause状态)> 后台activity( 比如执行了onStop),优先级越靠后越容易被系统杀死,另外,如果我们有一些工作需要长时间进行,那么最好将其放在Service中,因为没有四大组件运行的进程优先级非常低,很容易被系统kill掉。