1. Activity的生命周期
1. Activity的四种状态
应用程序的优先级是受最高优先级的Activity影响的。一般认为Activity有以下四种状态:
活动的:Activity是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。
暂停:在很多情况下,Activity可视但是没有焦点,不能接受用户输入,可能原因是被一个透明或者非全屏的Activity所覆盖。
停止: 当Activity不可视的,就是停止了。停止的Activity将仍然在内存中保存它所有的状态和成员信息。
待用: Activity被销毁后和被装载前,它是待用状态的。
onCreate :有一个参数BundlesavedInstanceState,该参数可能是start该activity时存放到Intent中的Bundle,也可能是之前调用 onSaveInstanceState(Bundle outState)方法保存的状态信息。
onStart :当Activity将被展现给用户时,触发该方法。
onRestart :当处于Stop状态的Activity需要再次展现给用户的时候,触发该方法。
onResume :当Activity能够和用户发生交互的时候,触发该方法。
onPause :当一个正在前台运行的Activity因为其它Activity需要前台运行而转入后台运行的时候,触发该方法。
onStop :当一个Activity不再展示给用户的时候,触发该方法。
onDestroy :当Activity被销毁的时候,触发该方法。
注意:无论现在是Pause状态还是Stop状态,当系统资源不足时,系统都会回收Activity的资源,当再次进入该Activity时进行重新创建。如果发生这种情况,可能onDestroy(),甚至是onStop()都没有得到执行。因此,如果有一些重要的数据和状态,需要在这种情况下也得到保存,就需要使用 onSaveInstanceState()函数,将重要的数据在销毁前进行保存,然后在onCreate()时重新读出。
onSaveInstanceState :保存Activity的状态。通常情况下,不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存Activity所涉及到的用户界面组件的所有状态信息。在onStop()之前被调用,但是并不保证在onPause()之前or之后调用。
onRestoreInstanceState :恢复Activity的状态,在onStart()之后调用。通常情况下,不需要重写覆盖该方法,在默认的实现中,会根据onSaveInstanceState()保存的状态信息,自动恢复Activity所涉及到的用户界面组件的所有状态信息。 在onStart()和onPostCreate()之间被调用。
注意:onSaveInstanceState()和onRestoreInstanceState()只在系统资源不足,系统强行销毁Activity和重新创建Activity时起作用。在正常情况下,系统并不依赖二者做状态的备份和恢复,因为实验证明,即使override这两个函数为空实现,系统依然可以在back时或者Home键切出去再切回来,做到原样恢复。
2. Home键和锁屏键对Activity生命周期的影响
1. Home键会调用当前Activity的onPause()和onStop(),而锁屏键只会调用当前Activity的onPause()。这是因为,onPause()和onResume()之间的转换开销小,可以频繁的锁屏 onPause()和onResume();而onStop()和onStart()之间的转换开销大,用户一旦按Home键,意味着希望进行其它操作。
2. 当Activity被部分遮挡时(被Dialog样式的Activity遮挡),系统只进行onPause()操作,并没有进行onStop()操作,返回之后,执行onResume()。
3. 当启动和退出Dialog时,Dialog实际上属于Acitivity内部的界面,不会影响Acitivty的状态,系统不会进行任何生命周期回调函数的操作。
1. 正常启动和activity切换
Startup - launch
ActivityA: ====> onCreate()
ActivityA: ====> onStart()
ActivityA: ====> onPostCreate()
ActivityA: ====> onResume()
ActivityA: ====> onPostResume()
activity A --> activity B
ActivityA: ====> onSaveInstanceState()
ActivityA: ====> onPause()
ActivityB: ====> onCreate()
ActivityB: ====> onStart()
ActivityB: ====> onPostCreate()
ActivityB: ====> onResume()
ActivityB: ====> onPostResume()
ActivityA: ====> onStop()
Back
ActivityB: ====> onPause()
ActivityA: ====> onRestart()
ActivityA: ====> onStart()
ActivityA: ====> onResume()
ActivityA: ====> onPostResume()
ActivityB: ====> onStop()
ActivityB: ====> onDestroy()
Back(exit)
ActivityA: ====> onPause()
ActivityA: ====> onStop()
ActivityA: ====> onDestroy()
2. Home Key
Home Key
ActivityA: ====> onSaveInstanceState()
ActivityA: ====> onPause()
ActivityA: ====> onStop()
Re-enter(bring back)
ActivityA: ====> onRestart()
ActivityA: ====> onStart()
ActivityA: ====> onResume()
ActivityA: ====> onPostResume()
3. 锁屏键
Power Key - lock screen
ActivityA: ====> onSaveInstanceState()
ActivityA: ====> onPause()
Power Key - unlock screen
ActivityA: ====> onResume()
ActivityA: ====> onPostResume()
4. Dialog Activity遮挡
Activity A --> DialogActivity C
ActivityA: ====> onSaveInstanceState()
ActivityA: ====> onPause()
ActivityC: ====> onCreate()
ActivityC: ====> onStart()
ActivityC: ====> onPostCreate()
ActivityC: ====> onResume()
ActivityC: ====> onPostResume()
Back
ActivityC: ====> onPause()
ActivityA: ====> onResume()
ActivityA: ====> onPostResume()
ActivityC: ====> onStop()
ActivityC: ====> onDestroy()