ans 做什么 cte oid 多系统 start void 回来
说到 activity 的生命周期,其实这就跟 android 的结构一样,最开始学的时候书上就有写,但是直到真正入门了,写过一些程序了才搞得清之前看到的那些是啥意思。
首先是这张经久不衰的图(反正也是随手百度来的,水印就不去了)
可以看到,单独一个 activity"从生到死",所需的过程是 onCreate,onStart,onResume,onPause,onStop,onDestroy 七个过程
那么稍微说一下这七个过程,或者说七个方法:
onCreate():
顾名思义,activity 创建时,所以这里需要执行的方法一般是加载布局,控件及一些变量参数的初始化
此时 activity 在后台,不可见
onStart():
activity 开始时,这里其实也可以执行初始化工作,不过由于官方推荐及我们自身编程习惯,还是在 onCreate 里来进行这些操作
此时 activity 在后台,可见
onResume():
activity 继续时, 执行到这也标志着 activity 成功运行了,一般动画的初始化应该在这里进行
此时 activity 在前台,可见
onPause():
activity 暂停时,一般是由于 activity 需要切换或者退出,将会执行该方法,该方法可以有 0.5 秒(超过 0.5 则会强制关闭 activity)的时间来做一些较为轻量的工作,例如数据存储,去初始化等
此时 activity 在前台,可见
onStop():
activity 停止时,一般执行资源回收的相关操作,此时 activity 还在内存中,如果需要的话还可以加载回去
此时 activity 在后台,不可见
onDestroy():
activity 销毁时,还是执行资源回收的相关操作,此时 activity 已经完全被销毁了,如果需要的话只能重新打开了
此时 activity 在后台,不可见
onRestart():
activity 重新开始时,当用户按 Home 键切换到桌面后又切回来或者从后一个 Activity 切回前一个 Activity 就会触发这个方法。这里一般不做什么操作。
此时 activity 在后台(据我推测),可见
这里说一下第八个过程
onSaveInstanceState():
保持实例状态,顾名思义就是保存当前的 activity 的一些所需要的参数,主要用于在 Activity 销毁时保存一些信息,以便下一次切换回来的时候或者打开的时候可以使用这些参数(之后会举例)
当 Activity 只执行 onPause 方法时(Activity a 打开一个透明 Activity b)这时候如果 App 设置的 targetVersion 大于 android3.0 则不会执行 onSaveInstanceState 方法。
当 Activity 执行 onStop 方法时,通过分析源码我们知道调用 onSaveInstanceState 的方法直接传值为 true,所以都会执行 onSaveInstanceState 方法。
生命周期这么多,到底有啥意义,有什么用呢,下面我们举个例子,走一遍业务逻辑来看一下
- public classMainActivityextends Activity {
- MapView mMapView =null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //获取地图控件引用mMapView = (MapView) findViewById(R.id.map);
- //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
- mMapView.onCreate(savedInstanceState);
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
- mMapView.onDestroy();
- }
- @Override
- protected void onResume() {
- super.onResume();
- //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
- mMapView.onResume();
- }
- @Override
- protected void onPause() {
- super.onPause();
- //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
- mMapView.onPause();
- }
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
- mMapView.onSaveInstanceState(outState);
- }
- }
这是高德地图 sdk 的使用方法,官方文档标明了需要在这些生命周期内执行这些方法,那么我们走一遍流程
首先布局文件被加载——地图控件初始化——执行定位或其他操作(以定位举例),这时我们需要高德地图实现的功能都已经实现了,没问题,但是当用户需要切换 activity 或者结束 activity 的时候,我们首先执行到 onPause,暂停地图的继续绘制(用户都不需要你继续定位了,就不用实时更新位置了),然后执行 onSaveInstanceState,保存用户目前定位的点,以便下次回来的时候使用,如果关闭的话执行 onDestroy,用户已经不需要这个 activity 了,地图控件也可以销毁了,释放资源,而如果是 activity 的切换,当切换回来时,会执行 onCreate 方法,用之前保存的参数来初始化地图(也就是打开之后直接显示上一次结束时的定位点),到这里看似好像还有一个 onResume 没说,但是其实也已经一直在这个循环内作用着,因为地图的绘制和一些动画,需要在这里进行初始化等操作。
最后说一下 activity 的切换流程
(1)一个 Activity 或多或少会占有系统资源,而在官方的建议中,onPause 方法将会释放掉很多系统资源,为切换 Activity 提供流畅性的保障,而不需要再等多两个阶段,这样做切换更快。
(2)按照生命周期图的表示,如果用户在切换 Activity 的过程中再次切回原 Activity,是在 onPause 方法后直接调用 onResume 方法的,这样比 onPause→onStop→onRestart→onStart→onResume 要快得多。
PS:参考博客:
深入理解 Activity 的生命周期
Android 源码解析(二十四)-->onSaveInstanceState 执行时机
Activity 生命周期
来源: http://www.bubuko.com/infodetail-2145140.html