类似文章网上数不胜数,这里我只是为了记录一下这个知识点,方便以后复习。
------------------------------------------------------------------------------------------------------------------------
下面梳理一下activity的生命周期。
onCreate(Bundle savedInstanceState) :通常用于初始化设置
onStart() :当Activity可见未获得用户焦点不能交互时系统会调用
onRestart() : 当Activity已经停止然后重新被启动时系统会调用
onResume(): 当Activity可见且获得用户焦点能交互时系统会调用
onPause(): 失去焦点时调用。应该使用onPause()来存储持久数据。
onStop():当Activity被新的Activity完全覆盖不可见时被系统调用
onDestroy():当Activity(用户调用finish()或系统由于内存不足)被系统销毁杀掉时系统调用,(整个生命周期只调用1次)用来释放onCreate ()方法中创建的资源,如结束线程等
Running(运行):在屏幕前台(位于当前任务堆栈的顶部)
Paused(暂停):失去焦点但仍然对用户可见(覆盖Activity可能是透明或未完全遮挡)
Stopped(停止):完全被另一个Activity覆盖
四.常见事件中activity生命周期函数调用顺序
参照了网上的文章,自己亲测正确,并补充了一些。
1.进入Activity
onCreate(创建) -> onStart(用户可见) -> onResume(获取焦点)
2.BACK键
onPause(失去焦点) -> onStop(用户不可见) -> onDestroy(被销毁)
4.休眠/恢复
休眠:onPause->onStop
恢复:onRestart->onStart->onResume
(1)未设置android:configChanges:
onPause -> onStop -> onDestory -> onCreate -> onStart -> onResume
(2)设置了android:configChanges="orientation|keyboardHidden":
不会调用生命周期函数,注意早期版本应该这样配置:
android:configChanges="oriention|keyboardHidden|screenSize"
注:activity中配置android:screenOrientation="portrait"和
android:screenOrientation="landscape"可以让界面保持横屏或竖屏。
6.来电
来电,显示来电界面:
onPause -> onStop
关闭电话界面,重新回到当前Activity:
onRestart -> onStart -> onResume
7.其他Activity
进入下一个Activity:
onPause -> onStop
从其他Activity返回至当前Acitivity:
onRestart -> onStart -> onResume
这里其实还得分情况,如果下一个activity中配置了这样的参数
android:theme="@android:style/Theme.Dialog"(即activity以dialog的形式显示)
则调用情况是这样的:
进入另一个activity:onPause
返回原activity:onresume
因为原来的activity只是失去焦点而已,并不是完全被覆盖。
五、与Activity生命周期结合的应用场景
与广播(Broadcast)结合
在onResume注册广播(registerReceiver),在onPause注销广播(unregisterReceiver)。 例如做"摇一摇"功能(传感器)、监听网络变化,就可以在onResume中注册监听,在onPause里注销掉,已节省资源提高效率。
与服务(Service)结合
在onStart绑定服务(bindService),在onStop中取消绑定(unbindService)。 例如:需要通过Service定时更新UI上的数据,而Activity的可见周期在onStart与onStop之间,那么就可以再onStart时启动服务,在onStop时停止服务。为了节约系统资源,除了提高用户体验以外,开发人员应尽可能的优化程序。
释放资源
可以在onDestory中释放一些资源。比如可以在onDestory时调用MediaPlayer的release。
1 所有Activity生命周期方法的实现都必须先调用其父类版本(如super.onCreate)。
2 由于Activity经常会暂停和恢复之间切换,所以onResume和onPause这两个方法应当是轻量级的。
3 在系统再某种紧急情况下需要回收内存,onStop、onDestory可能不会被调用,因此需要在onPause中把需要长期保存的数据保存起来。