Activity生命周期

Posted Qunter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity生命周期相关的知识,希望对你有一定的参考价值。

  说到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 class MainActivity extends 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的切换流程

  (A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop

  而不是

  (A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume

  (1)一个Activity或多或少会占有系统资源,而在官方的建议中,onPause方法将会释放掉很多系统资源,为切换Activity提供流畅性的保障,而不需要再等多两个阶段,这样做切换更快。
  (2)按照生命周期图的表示,如果用户在切换Activity的过程中再次切回原Activity,是在onPause方法后直接调用onResume方法的,这样比onPause→onStop→onRestart→onStart→onResume要快得多。

  PS:参考博客:

  深入理解Activity的生命周期

  Android源码解析(二十四)-->onSaveInstanceState执行时机

 

以上是关于Activity生命周期的主要内容,如果未能解决你的问题,请参考以下文章

导航上的片段生命周期重叠

使用 Fragment 和 Activity 执行生命周期流程的问题

自动挂钩到 Activity 生命周期方法的异步任务库

React Native 中的 Android Activity 生命周期 - ViewPager

我可以管理生命周期所有者,用 Koin 注入 viewModel 吗?

Activity的生命周期