![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zM0YTN1ADMzIDNxYDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
看了些activity生命周期的文章,感觉没有特别清楚,有必要自己总结一下,话不多说,神图镇楼,本文将涉及activity切换,home,back,锁屏等各种情况。
预备知识
ActivityState
onResume执行之后,activity进入Resumedstate
onPause执行之后,activity进入PausedState
onStop执行之后,activity进入StoppedState
内存不足的时候,会尝试去杀后台进程,而不会去杀单独的activity。
visible life
onStart和onStop之间,此时activity可见
foreground life
onResume和onPause之间,此时activity在前台
解释
onStart
此时activity已经可见了,只是不在前台,可理解为activity已经显示出来了,只是用户还看不到,还在后台。
onResume
此时activity在前台,在activity栈的栈顶,可以和用户进行交互
onPause
activity即将失去前台地位,有新的前台activity到来,如果想要在onPause或者onStop内做heavy的事情(尽量不要这么做),请选择onStop,因为activity切换的时候,是 第一个activity onPause之后,第二个activity才显示,然后才调第一个activity的onStop.如果onPause做了比较多的事情,那么activity切换就会慢。而onStop调用的时候,第二个activity已经显示出来了。只要被部分遮盖了,就会调用onPause。 往往在这个方法里做一些数据保存,动画停止的工作.这里是一个activity可以保证在死亡之前达到的回调。activity被回收的时候,onStop和onDestroy还没走到,那也就不会去走。如果对数据非常敏感,那么请在onPause这里保存数据。 onPause被调用的原因,一般只有2个,第一,activity切换,即将有个activity来到前台, 第二,调用了finish(),在activity是Resumedstate的时候调用finish()会导致onPause,onStop,onDestroy被调用。
如何判断 onPause 是怎么引起的呢?可以在onPause调用isFinishing(),为true,那说明是finish导致的
onStop
此时activity已经完全不可见了
单activity
点击图标进入界面
1 onCreate
1 onStart
1 onResume
点击back退出界面
1 onPause
1 onStop
1 onDestroy
重新进入此界面,然后点击home键会发生什么事呢?
1 onPause
1 onStop
切换回界面
1 onRestart
1 onStart
1 onResume
锁屏的和按home键是类似的,锁屏会调用onPause和onStop,解锁会调用onRestart,onStart,onResume
旋转屏幕,相当于重新创建了个activity
1 onPause
1 onStop
1 onDestroy
1 onCreate
1 onStart
1 onResume
activity切换
普通activity
1 onPause
2 onCreate
2 onStart
2 onResume
1 onStop
activity1切换到2,先onPause1,然后创建2,在2onResume之后,1才onStop。 此时已经切换到activity2了,如果此时点击返回,会发生什么呢?
2 onPause
1 onRestart
1 onStart
1 onResume
2 onStop
2 onDestroy
可以看到此时2的onStop依然是在1的onResume,此时我们可以得出一个结论,2个activity切换的时候,必然是1个activity要消失(activity A),一个要出现(activity B),必然是先调用A的onPause,然后B会逐渐出现,直到onResume之后,才调用A的onStop
非完全覆盖activity及透明activity
如果跳转到一个不完全覆盖的activity呢?又有什么区别?(ps如何创建一个不完全覆盖的activity呢? android:theme="@android:style/Theme.Dialog")
1 onPause
2 onCreate
2 onStart
2 onResume
看看区别,少了个onStop,为什么呀?activity并没有完全消失,只有activity完全消失了才会掉onStop,这下我们可以理解为什么刚才B onResume之后才会调A的onStop,因为此时A才完全不可见。
跳转到透明的activity的情况和这个一样,如何搞一个透明activity呢?android:theme="@android:style/Theme.Translucent.NoTitleBar"或者android:theme="@android:style/Theme.Translucent"
系统回收
当系统很缺资源的时候,有可能会使用finish()终止PausedState或StoppedState的activity,甚至系统可能直接杀死进程.无论哪种方式只要是系统干掉的,下次点击的时候系统会自动重新创建并恢复那个activity。 一个activity如果在PausedState被回收了,那么onStop,onDestroy都不会被调用
一个activity如果在StoppedState被回收了,那么onDestroy不会被调用。
系统优先于回收StoppedState状态的activity.