Activity的生命周期

前言

Activity作为Android四大组件之一,是日常开发最常见的知识,而它的生命周期则是基础中的基础
是不可捍卫的基石。但很多开发者却依然看不清它的本质、方法调用顺序、每个方法对应的含义等
接下来我将尽我所能,为大家拨开迷雾

正文

生命周期方法的描述

image
方法名 描述
onCreate() 第一次创建时被调用,这时应该做一些常规静态操作比如:创建视图,数据、事件绑定等
onStart() Activity可见时被调用,但还没出现在前台,还无法与用户进行交互,当 Activity 返回前台时,onResume() 方法会在此方法执行之后被调用;当 Activity 变为不可见时,onStop() 方法会在此方法执行之后被调用
onRestart() 在Activity停止之后并且重新启动之前调用,如:点击Home健再返回应用
onResume() 当Activity于用户交互时调用,此时 Activity 处于 Activity 堆栈的栈顶
onPause() 启动或恢复另一个 Activity 时被调用。应当在此方法内保存一些关键数据、释放一些消耗 CPU 的资源、停止动画等。此方法应当被迅速执行,因为只有该方法执行完成之后,下一个 Activity 才能被执行。当 Activity 返回前台时,onResume() 方法会在此方法执行之后被调用;当 Activity 变为不可见时,onStop() 方法会在此方法执行之后被调用
onStop() 当Activity不可见时被调用,如果被销毁则调用onDestroy(),如果重新与用户交互则调用onRestart (),此时可做一些稍微重量级的回收工作
onDestroy() Activity被销毁时调用,此时可做一些重量级的回收工作

Activity各种常见情况下的生命周期方法调用顺序

  • 启动一个Activity:执行onCreate、onStart、onResume
  • AActivity启动BActivity:A执行onPause,B执行onCreate、onStart、onResume,A执行onStop(如果新的Activity采取透明主题,那么当前Activity不会回调onStop)
  • BActivity返回到ActivityA:B执行onPause,A执行onRestart、onResume,B执行onStop
  • 点击Home键:执行onPause、onStop
  • 点击Home键后回到应用:执行onRestart、onStart、onResume

各自对应的生命周期

  • onCreate与onDestroy:Activity的创建与销毁
  • onStart与onStop:Activity的可见与不可见状态
  • onResume与onPause:Activity获取焦点与失去焦点(或者叫是否位于前台)
  • onRestart没有对应的生命期,它在一个Activity被重新启动或者重新可见的情况下必然会被调用。如:点击Home键后返回应用、跳转到下个页面后再返回

应用场景

对于Activity生命周期方法,我们不应该死记硬背。而是结合实际应用场景,让我们对它的印象达到深刻效果
如:执行中的动画、播放中的音频、视频。在适当的生命周期对其进行播放和暂停,那什么是适当?
从视觉效果上:假设用户进行锁屏操作,当前展示的Activity看不到了,那理应对一些资源进行停止。然后在Activity可见的时候再继续播放。
综上所述:查找对应的生命周期方法描述,把关注点放到onStart和onStop上。但再仔细思考发现onStart方法只会在Activity创建之初紧跟在onCreate后执行,当锁屏再解锁时并不会执行onStart方法
而且onStop方法并不合适做一些暂停动画、音频等系列的操作,因为Activity的生命周期在异常情况下太过微妙,有的场景甚至没走onStop方法Activity就直接销毁走了onDestroy方法。
onPause和onResume方法不管在什么场景下总会执行(点击Home、锁屏等情况)。所以暂停与播放操作应该放在这两个方法上

异常情况下的生命周期调用

在异常情况下Activity被杀死并重新创建的情况有两种:一:屏幕旋转、二:内存不足导致系统回收

1:当Activity处于竖直状态时,如果突然旋转屏幕,在默认情况下,Activity会被重新销毁然后重新创建。
当屏幕旋转时,Activity会销毁,相继执行onPause、onStop、onDestroy三个回调。并且系统将调用onSaveInstanceState方法保存当前用户状态,需要注意的是:这个方法只会在Activity异常终止的时候被调用。
Activity被重新创建后,系统则会调用onRestoreInstanceState方法并且把被销毁时通过onSaveInstanceState保存的Bundle对象作为参数传递给onRestoreInstanceState和onCreate方法中
另外:在onRestoreInstanceState中的Bundle是绝对不为空的,而onCreate中的Bundle则未必
非默认情况下,即:为AndroidManifest清单下的Activity添加android:configChanges="orientation"
设置之后Activity就可在旋转情况下不被销毁和重新创建,这也是我建议大家为每一个Activity加上该属性的原因

示例代码如下:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.e(MainActivity::class.java.simpleName, "onCreate")
        savedInstanceState?.let {
            Log.e(MainActivity::class.java.simpleName, savedInstanceState.getString("test_key"))
        }
    }

    override fun onSaveInstanceState(outState: Bundle?) {
        super.onSaveInstanceState(outState)
        outState?.putString("test_key", "test")
        Log.e(MainActivity::class.java.simpleName, "onSaveInstanceState")
    }

    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        Log.e(MainActivity::class.java.simpleName, "onRestoreInstanceState")
        Log.e(MainActivity::class.java.simpleName, savedInstanceState.getString("test_key"))
    }

 
         android:configChanges="orientation|screenSize">
            
                

                
            
 

2:当内存不足时导致系统回收Activity,先引用《Adnroid开发艺术探讨》中一段关于Activity优先级说明

1:前台Activity-正在和用户交互的Activity,优先级最高
2:可见但非前台Activity-比如Activity中弹出一个对话框,导致Activity可见但是位于后台无法和用户直接交互
3:后台Activity-已经被暂停的Activity,比如执行了onStop,优先级最低

如果系统内存不足,则会按照以上说明的优先级进行回收。这时应该在onSaveInstanceState和onRestoreInstanceState方法中做相对应的措施。

参考资料:
Android Developers

全文完

你可能感兴趣的:(Activity的生命周期)