android生命周期

Activity生命周期

Android生命周期还是比较简单明了的:

  • onCreate: 做初始化,设置UI
  • onStart:1. 在onCreate后调用,2. Activity被Stopped,但是又被放到前台展示,会先回调onRestart,再回调onStart
  • onResume:1. 动画在这里做,2. 如果想标识Activity可见,onResume不是最好的选择,最好使用onWindowFocusChanged
  • onPause:A启动B,A先回调onPause,B再回调onCreate,这里经常用于保存持久的数据,停止动画等一些消耗资源的操作,这样可以快速启动下一个Activity
  • onStop:做一些重量级的回收
  • onDestroy:做一些最终的回收工作和资源释放,不适合做数据保存,因为某些情况下,系统会直接杀死进程,而不会回调这个方法
  • onRestart:Activity A被置于后台,生命周期走到onStop,然后又返回前台时,先回调onRestart,在回调onStart->onResume

其中生命周期两两相对应

注意点

onSaveInstanceState和onRestoreInstanceState、onCreate

在系统即将杀死Activity之前保存当前activity的一些数据,然后在onCreate或者onRestoreInstanceState中取回这些数据。这里要注意两个关键词

  1. 系统即将杀死,两层意思,一是必须是系统想要杀死这个Activity,而不是用户操作导致,比如说,正常的通过intent跳转Activity时,用户的想法是把Activity放在后台,但是系统会认为,放在后台有可能被系统销毁,那么保险起见回调onSaveInstanceState来保存数据。二是如果系统想要杀死,那么肯定会回调onSaveInstanceState。
  2. onSaveInstanceState会委托window保存当前activity的View的结构和数据,每个View都有onSaveInstanceStateonRestoreInstanceState,可以看看各个View都能保存什么数据
  3. 在onCreate或者onRestoreInstanceState中取回,这里说的是或有两层意思,一是这两个方法可能不会被回调,这是因为,虽然系统判断需要杀死Activity,但是却还没杀死(比如按home键然后立即返回),那么当再次返回这个Activity时,仅仅会回调Activity的生命周期。但是如果确实杀死了Activity(比如手机屏幕旋转,这种情况是系统想要杀死Activity,然后重新创建新的Activity实例),那么肯定会走onCreate->onStart->onRestoreInstanceState->onResume,而且onCreate和onRestoreInstanceState中都有保存的数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    05-13 20:18:29.889 31673-31673/study.zgq.com.androidstudy D/nanwei: ------------>>MainActivity onCreate
    05-13 20:18:30.044 31673-31673/study.zgq.com.androidstudy D/nanwei: ------------>>MainActivity onStart
    05-13 20:18:30.045 31673-31673/study.zgq.com.androidstudy D/nanwei: ------------>>MainActivity onResume
    05-13 20:26:25.560 31673-31673/study.zgq.com.androidstudy D/nanwei: ------------>>MainActivity onPause
    05-13 20:26:25.577 31673-31673/study.zgq.com.androidstudy D/nanwei: ------------>>MainActivity onStop
    05-13 20:26:25.635 31673-31673/study.zgq.com.androidstudy D/nanwei: ------------>>MainActivity onSaveInstanceState
    05-13 20:26:25.636 31673-31673/study.zgq.com.androidstudy D/nanwei: ------------>>MainActivity onDestroy
    05-13 20:26:25.670 31673-31673/study.zgq.com.androidstudy D/nanwei: ------------>>MainActivity onCreatethis is a save
    05-13 20:26:25.765 31673-31673/study.zgq.com.androidstudy D/nanwei: ------------>>MainActivity onStart
    05-13 20:26:25.766 31673-31673/study.zgq.com.androidstudy D/nanwei: ------------>>MainActivity onRestoreInstanceState: this is a save
    05-13 20:26:25.768 31673-31673/study.zgq.com.androidstudy D/nanwei: ------------>>MainActivity onResume

上面的是手机屏幕旋转时的函数调用情况。
需要注意的是onSaveInstanceState的调用时机,从android p开始,onSaveInstanceState在onStop之后调用,在android P之前,在onStop之前调用,至于是不是再onPause之前还是之后并没有任何保证。
onRestoreInstanceState调用时机是onStart之后。

如果不想在屏幕旋转的额时候重新创建Activit,manifest中加 android:configChanges="orientation|screenSize

Fragment生命周期