用户在使用一个应用程序时,随着应用的启动、页面的跳转、进入后台等一些操作的发生,Activity会回调一些固定的方法,这些回调方法标识了Activity的状态改变,比如创建、销毁、暂停、进入后台等等。这就是Activity的生命周期。
2、Activity生命周期回调方法有哪些?常用的7个 + Activity异常关闭(比如内存不足)2个 = 9个方法
常用的7个:(3对方法+1个重新启动方法):
创建/销毁:onCreate(Bundle savedInstanceState) /onDestroy()
启动/停止(可见/不可见):onStart()/onStop()
在前台/在后台:onResume()/onPause
已经存在的activity重新启动: onRestart()
Activity异常的2个:
异常退出保存数据:onSaveInstanceState(Bundle savedInstanceState)
恢复Activity之前保存的数据:onRestoreInstanceState(Bundle savedInstanceState)
onCreate(Bundle savedInstanceState)
调用时机:系统在第一次创建Activity时候回调,并且只会回调一次。
作用:可以做一些初始化的工作,比如:
setContentView ()
初始化控件 findViewById()
与ViewModel关联
发送http请求
可以利用只会调用一次的特点,做一次性操作。
onStart()
调用时机:紧跟onCreate()之后,当Activity进入启动状态时,被调用。
作用:这个方法调用代表Acitvity已经可见(但是在后台)
这个方法可以用来做页面追踪来记录“进入页面”的用户行为
onResume()
调用时机:onStart()之后,当Activity“每次”来到前台时候被调用。注意是“每次”,
作用:这个方法代表Activity已经可以和用户进行交互了,在可交互状态会保持在这个生命周期不动,除非被打断,比如按了home键,息屏等等。因为Activity每次回到前台,都会调用这个生命周期方法(屏幕的亮灭、按Home键在回到页面等等),可以在这个方法里面做一些刷新页面的操作,比如重新发送http请求显示最新数据等等。
onPause()
调用时机:当Activity回到后台时候被调用。
作用:这个方法代表Activity已经失去了用户焦点,不能和用户进行交互了。但是这不代表这个Activity不可见,准确的来形容因该是这个Activity“部分可见”。这个方法用要注意以下2点:
1、当启动了一个使用了dialog主题或者透明主题的新Actvity时,原Activity还能看到部分界面,没有完整别遮盖,但是失去了焦点。这时原Activity会停留在onPause()生命周期,原Activity重新回到前台时候会直接回调onResume()生命周期。
当多个应用程序以多窗口模式运行时。因为任何时候只有一个应用程序有焦点,系统会暂停所有其他应用程序。也会停留在onPause()
2、要注意不要再onPause()方法中做耗时操作,因为会影响从这个Activity启动的新Activity的速度,原因是原Activity先执行完onPause()才去创建新Activity,新Activity执行完onResume()也就是出现在前台时候,原Activity才会走onStop()
onStop()
调用时机:当Activity不可见时候被回调。这里的不可见,是完全看不到了。
作用:可以在这个方法里停止一些不需要的操作,比如暂停动画播放,暂停banner轮播等,onStop()也是用来做页面追踪来记录“退出页面”的用户行为。
onDestroy()
调用时机:当Activity销毁时候被回调。是Activity生命周期的最后一步。
作用:这里主要就是要做一些回收清理工作,避免内存泄漏。比如把对象置null。调用一些对象的close方法等等。
onRestart()
调用时机:当Activity重新显示时回调,接下来是回调onStart()和onResume()。
作用:这里可以做一些重新请求。onResume()中做请求会太过频繁,onRestart() 只有在处于onStop()的Activity,重新回到前台过程中,回调一次。
以下两个方法笔者理解也可以划分为生命周期方法,因为随着Activity的创建和销毁会根据时机回调。而且下面2个方法的参数还和onCreate方法的参数有这关联。但是官方文档建议不要同上面7种生命周期方法混淆。同onActivityResult()方法不一样,onActivityResult不是Activity毕竟之路。
onSaveInstanceState(Bundle savedInstanceState)
调用时机:当Activity被系统异常销毁时,会回调此方法,在Activity正常销毁时不会调用。
如果调用此方法,将在onStop()之后执行。(老版本系统将在onStop()之前回调,且不能保证它和onPause()方法回调的先后顺序。比如Android5.0版本。)
作用:onSaveInstanceState作用很专一。一般就是用来存储需要保存的数据。异常情况(比如内存不足被回收)的出现,会使Activity中的一些必要数据丢失。可以用此方法中的Bundle参数用键值对的形式保存。这个参数会传递给onCreate(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)2个方法。用来恢复数据。
onRestoreInstanceState(Bundle savedInstanceState)
调用时机:当Activity被重新创建,系统会调用次方法,onStart()之后onResume()之前被调用。
作用:通过Bundle参数来恢复数据,这个参数同onCreate方法中的参数是一样的。且这个方法的参数肯定不为null,onCreate()的参数有可能为null,要注意判断,官方建议在onRestoreInstanceState中做恢复数据操作。
最后:并不是所有的生命周期方法都需要重写,要根据你的Activity业务流程,适当选择重写哪些方法。本文如有错误欢迎留言指正。
作者:calmerman