Andorid: Activity 全解析
1.生命周期:
1.1 基础生命周期
老图了,就不解释详细了,重点提下:
1.1.1 Activity3种运行状态:Resumed、Paused、Stopped
Paused:这个Activity在屏幕上是可见的,但是并不是在屏幕最前端的那个Activity。比如有另一个非全屏或者透明的Activity是Resumed状态,没有完全遮盖这个Activity。
Stopped:当Activity完全不可见时,此时Activity还在后台运行,仍然在内存中保留Activity的状态,并不是完全销毁。
1.1.2 各生命周期
onStart():表示Activity正在被启动,即将开始,没有出现在前台,这时Activity已经出现了。注意:onStart时,对应Paused状态,Activity可见,不可点击(交互),不可获取焦点。
onResume():表示Activity已经可见了,并且出现在前台并开始活动。注意:onResume时,对应Resumed状态,Activity可见,可点击(交互),可获取焦点。
onPause():表示Activity暂停,仍可见,正常情况下,紧接着onStop就会被 调用。在特殊情况下,如果这个时候快速地回到当前Activity,那么onResume就会 被调用(极端情况)。onPause中不能进行耗时操作,会影响到新Activity的显 示。因为onPause必须执行完,新的Activity的onResume才会执行。 注意:onPause时,对应Paused状态,Activity可见,不可点击(交互),不可获取焦点。
onStop():表示Activity即将停止,不可见,位于后台。可以做稍微重量级的回收 工作,同样不能太耗时。注意:onStop时,对应Stopped状态,Activity不可见,不可点击(交互),不可获取焦点。
onDestory():表示Activity即将销毁,可以做一些回收工作和最终的资源回收。
1.2 特殊生命周期
onSaveInstanceState():当Activity遇到意外情况退出时调用保存数据,以下5种情况被调用:
(1)、当用户按下HOME键时。
(2)、从最近应用中选择运行其他的程序时(长按手机home键或者按下菜单键时)。
(3)、按下电源按键(关闭屏幕显示)时。
(4)、从当前Activity启动一个新的Activity时。
(5)、屏幕方向切换时(无论竖屏切横屏还是横屏切竖屏都会调用)。
注意:onSaveInstanceState和onPause没有固定时序,但两者都确定是在onStop之前调用,后文为了方便,将onSaveInstanceState放到onPause后面。
onRestoreInstanceState():只有在Activity确实是被系统回收,重新创建Activity的情况下才会被调用,用于重建时恢复数据。
注意:严格意义来说,onSaveInstanceState、onRestoreInstanceState并不算Activity的生命周期,因为它们不是一定被调用的。onRestoreInstanceState只有在Activity确实是被系统回收,重新创建Activity的情况下(即重走onCreate)才会被调用,比如旋屏,Activity确实被销毁后又重新onCreate。而HOME键切换则不会。
1.3 通常状况下生命周期调用情况
(1)针对一个特定的Activity,第一次启动,回调如下:onCreate()->onStart()>onResume()
(2)用户打开新的Activiy的时候,原Activity的回调如下:onPause()->onSaveInstanceState()->onStop()
(3)再次回到原Activity时,回调如下:onRestart()->onStart()->onResume() 注意:虽然调用了onSaveInstanceState,但onRestoreInstanceState并不会被调用。
(4)按back键回退时,回调如下:onPause()->onStop()->onDestory() 注意:因为back为主动退出行为,所以不会调用onSaveInstanceState。
(5)按Home键切换到桌面后又回到该Actitivy,回调如下:onPause()->onSaveInstanceState()->onStop()>onRestart()->onStart()->onResume() 注意:虽然调用了onSaveInstanceState,但onRestoreInstanceState并不会被调用。
(6)调用finish()方法后,回调如下:onDestory()
(7)横竖屏切换,回调如下:onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume() 注意:可以指定 android:configChanges = "orientation| screenSize" 来避免横竖屏切换时,Activity被销毁和重建,指定后,Activity不会调用onDestroy和onCreate,而是回调了下面的方法:
@Override
public void onConfigurationChanged(Configuration newConfig)
1.4 启动模式
//TODO