Android Activity生命周期
简单理解Activity的管理机制
描述: Android的Activity可以理解为页面的最小操作对象,它采用的是一种任务栈来管理Activity的
Activity也可以理解为页面
-
出栈:栈是我们非常熟悉的一种数据结构,先进后出是他的一个特性,而我们在栈里面是放入了许多个Activity,因此我的页面是层叠的,当我们将当前显示在屏幕上的Activity按下返回销毁的时候,Activity就会从我们的栈中pop出去,此时如果栈里面空了,则我们的应用会关闭,否则则会显示栈中栈顶的Activity在我们的屏幕中。
-
入栈:出栈则是将当前的Activity压入栈顶,上一个栈顶的Activity则成为了栈顶下面的Activity,此时显示的则是在栈顶的Activity。还有一种情况就是,会显示多个Activity(页面),为什么会出现这种情况呢,那就是有一些Activity并非全屏显示,例如我们常见的Toast,还有一些对话框。
Activity的四种状态
-
运行状态
当前Activity位于栈顶位置,上面我们说过栈顶的元素必然是在显示器上显示的。
GC对运行状态的销毁优先级是最低的。
-
暂停状态
这种情况就是我们描述的一种情况,即当前的Activity不处于栈顶,但依旧活跃可见,例如Toast,对话框下面的Activity。
GC对运行状态的销毁优先级是比较低的。
-
停止状态
当前Activity完全不可见,自然他也不会处于栈顶位置。
GC对运行状态的销毁优先级是比较低的。
-
销毁状态
当前Activity已经出栈,即在栈中被移除。
GC对于此类Activity的回收优先级是最高的
Activity的七个生命周期钩子
-
onCreate()
见名思意,就是在第一次创建Activity的时候被调用,当你重写这个方法的时候,你就可以在创建Activity之前做一些自己的逻辑业务代码。
建议:推荐一些初始化、样式、布局、事件绑定你可以在这里做
-
onStart()
这个方法是在 Activity 可见 ----> 不可见 时候调用。至于这个概念在上面有描述。
你也可以理解为 (运行/暂停状态 ----> 停止/销毁状态)
-
onResume()
在用户和Activity交互之前调用(有些书里面会说是准备好交互式,我个人理解为交互前),这个时候当前的Activity一定出于栈顶。自然他的状态也就是处于运行状态
-
onPause()
在Activity 即将变成可见状态 之前调用(一般就是启动、或者是恢复Activity,总之此时的Activity即将变为可见状态)
建议:一般我们在这里不能写过多的业务,这样会影响页面的显示时间,从而影响用户体验,我们可以在这里释放一些资源,以及保留一些关键数据。
-
onStop()
在Activity完全不可见之前调用,他与onPause()方法的区别在于:
如果启动的新 Activity 是一个对话式的Activity,onPause()会执行,而onStop()不会
-
onDestroy()
在Activity销毁之前调用,此后Activity自然也就成为销毁状态,随时可能被GC回收
-
onRestart()
由停止状态变为运行状态之前调用。
总结:
如果是细心的同学,你会发现除了最后一个onRestart()方法之外的其他方法都是两两成对的。
于是我们有将7个生命周期钩子,组装了一下,分了一下时段,分别如下:
-
完整的生命周期:
onCreate() -------> onDestroy() 这个区间是一个完整的生命周期
建议:一般我们在onCreate()做一些初始化,在onDestroy() 做一些释放,然后根据业务需求在中间的生命周期钩子中做自己的业务需求。
-
可见生命周期:
onStart() -------> onStop() 这区间是一个可见的生命周期
在这个生命周期区间中,我们都是Activity的资源都是基本存在的。
-
前台生命周期:
onResume()-------> onPause() 这区间是一个前台的生命周期
在这个区间中,我们的Activity都是绝对可交互的,也就是可见的。