image.png

注意,当系统因为内存不足(优先级更高的应用需要内存,请看上图红框)要回收Activity占用的资源时,Activity在执行完onPause()方法后就会被销毁,有些生命周期方法onStop(),onDestory()就不会执行。当再回到此Activity时,是从onCreate方法开始执行

生命周期

  • onCreate
    • 表示activity正在被创建
    • 初始化工作:setContentView、初始化Activity需要的数据
  • onRestart
    • 表示重新创建
    • Activity从不可见重新变为可见才会调用
    • 一般是用户所致,如按下home键
  • onStart
    • 正在启动
    • Activity在后台—已经可见但是没出现在前台、无法和用户交互
    • 可以理解为Activity已经显示出来,但是我们看不到
  • onResume
    • 已经可见,并且在前台开始活动
  • onPause
    • 表示Activity正在停止
    • 可以做一些存储数据、停止动画等
    • 注意不能太耗时,会影响新Activity的显示—onPause必须执行完,新的Activity onResume才会执行
  • onStop
    • 表示Activity即将停止
    • 可以做一些稍微重量级的回收工作,同样不能太耗时
  • onDestroy
    • 表示Activity即将被销毁
    • 回收工作和最终的资源释放

onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的,除了这种区别,在实际使用中没有其他明显区别

生命周期切换过程

  • 针对一个特定的Activity,第一次启动,回调如下:onCreate>onStart>onResume
  • 打开新的Activity或者切换到桌面的时候,回调如下:onPause>onStop。
    • 特殊情况:如果新Activity采用了透明主题,那么当前Activity不会回调onStop
  • 当用户再次回到原Activity时,回调如下:onRestart>onStart>onResume
  • 当用户按back键回退时,回调如下:onPause>onStop>onDestroy
  • pair
    • onCreate和onDestroy, 标识Activity的创建和销毁
    • 是否可见:onStart和onStop, 随着用户操作和设备屏幕点亮和熄灭,可能调用多次
    • 是否在前台: onResume和onPause, 随着用户操作和设备屏幕点亮和熄灭,可能调用多次

Activity异常结束

  • 时机
    • 系统回收Activity
    • 设备的Configuration改变导致Activity销毁重建
      • 必须设置为android:configChanges=”orientation|screenSize”时,不会重走生命周期
        • 只会回调onConfigurationChanged方法
  • 流程
    • onStop之前回调onSaveInstanceState保存数据
    • 在onStart之后回调onRestoreInstanceState
    • 其中Bundle数据会传到onCreate(不一定有数据)和onRestoreInstanceState(一定有数据)
  1. /**
  2. * saveInstance 不一定有数据
  3. * @param saveInstance
  4. */
  5. @Override
  6. protected void onCreate(Bundle saveInstance) {
  7. super.onCreate(saveInstance);
  8. // Check whether we're recreating a previously destroyed instance
  9. if (saveInstance != null) {
  10. // Restore value of members from saved state
  11. mUser = saveInstance.getString(STATE_USER);
  12. } else {
  13. // Probably initialize members with default values for a new instance
  14. mUser = "NewUser";
  15. }
  16. }
  17. @Override
  18. protected void onSaveInstanceState(Bundle outState) {
  19. outState.putString(STATE_USER, mUser);
  20. //onStop之前调用
  21. // Always call the superclass so it can save the view hierarchy state
  22. super.onSaveInstanceState(outState);
  23. }
  24. @Override
  25. protected void onRestoreInstanceState(Bundle savedInstanceState) {
  26. super.onRestoreInstanceState(savedInstanceState);
  27. //不需要判断savedInstanceState, 在onStart后调用
  28. // Restore value of members from saved state
  29. mUser = savedInstanceState.getString(STATE_USER);
  30. }

fragment

service