上图是官方示意图,将整个生命周期分为6个部分
- Created 首次创建并被初始化,整个生命周期中只调用一次
- Started 初始化完成,用户此时已经可以看到Activity窗口,但并不能交互
- Resumed 完成创建,此时可以与用户进行交互
- Paused 失去焦点,此时不可与用户进行交互
- Stopped 处于用户不可见状态,但并没有被销毁
- Destoryed 被系统销毁,释放资源
回调函数
Activity的生命周期是由framework层的ActivityServiceManager控制的,用户并不能控制Activity的生命周期,但是可以通过Activity生命周期变化的几个回调方法来影响并管理Activity生命周期
-
onCreate()
- 新建Activity的回调方法,只有当Task栈中没有对应的Activity时才调用该方法
- 此回调方法会默认调用一个名为savedInstanceState的Bundler对象(该对象在内存中),并通过检测该对象是否为null来判断是否创建新的实例或恢复被Destroy的Activity对象
- 必须调用父类的onSaveInstanceState()才能恢复Activity的状态信息
-
onStart()
- 初始化完成后的回调方法,用户此时可以看到Activity的界面,但不能进行交互操作
- 此回调方法中的操作与onStop()方法对应,即在onStop()中释放了哪些资源,就要在onStart()方法中重新创建
- 在此回调方法之后有一个方法onRestoreInstanceState()可以恢复Activity的状态信息
-
onResume()
- 启动或重新启动Activity完成后的回调方法,此时用户可以进行交互
-
onPause()
- Activity失去焦点后的回调方法,此时界面可见,但是无法交互 - 在此回调方法中可以保存数据到缓存中(并非写入数据库或者文件),停止animation,释放GPS、Camera等资源。注意在onPause()中避免进行耗费CPU资源的操作
-
onRestart()
- 重新启动Activity时的回调方法,该方法中会直接执行start方法
-
onStop()
- Activity不可见时的回调方法,用户此时已经看不到Activity的界面,但是Activity本身未被销毁
- 因为系统在内存紧张时,可能会在调用onDestory()方法之前就销毁Activity所以在onStop()回调方法中释放资源,防止内存泄漏。此外对于耗费CPU资源的操作,如保存数据到数据库或文件中也可以在该回调方法中操作
- 该回调方法中系统也会默认调用onSaveInstanceState()方法,保存Activity的状态信息
-
onDestory()
- Activity被移出Task栈,并被系统销毁
常见场景的分析
-
启动Activity
当系统得到启动一个Activity的请求时,会到当前进程的ActivityTask栈中寻找对应的Activity;如果没有找到则创建该Activity。会依次调用onCreate() -> onStart() -> onResume() 进入Resumed状态
-
销毁Activity
当Activity从Task栈被退出时,启动销毁流程;如果本身处于Stopped状态,则直接调用onDestroy()销毁;如果处于Resumed状态,则会依次调用onPause() -> onStop() -> onDestroy() 进入Destroyed状态
-
在Activity A基础上启动新Activity B
因为启动B,A要从Resume的状态变为Stopped状态,依次调用onPause() -> onStop();而B依然按照正常启动的方式依次调用onCreate() -> onStart() -> onResume();但是A只有在B启动完毕进入Resumed状态后才会进入Stopped状态,所以对于A与B整个时间序列上,是如下表的形式
-
将Activity B弹出并还原Activity A(假定A未被销毁)
B被Task栈弹出,所以要被销毁至Destroyed状态;而A此时处于Stopped状态,要切换至Resumed状态,依次调用onRestart() -> onStart() -> onResume();同理,B会先进入Paused状态,等A Resume完成后才进入Stopped状态。时间序列如下
-
弹出与关闭对话框
当弹出对话框时,Activity在视图上可见但处于失去焦点的状态,即Paused;所以此时Activity会调用onPause()方法;当对话框被关闭时,Activity会调用onResume()方法重新获取焦点
屏幕旋转
如果未配置Manifest中的android:configChanges
,则在切换横竖屏时Activity的生命周期将重新开始,会调用onCreate(),生命周期重新开始
如果配置Manifest中的android:configChanges="keyboardHidden|orientation|screenSize"
,则将调用onConfigurationChanged,并且不会调用onCreate(),而是直接从onStart()开始调用
参考资料
Android生命周期
Android Activity生命周期都该做哪些事情?
网友评论