首先给大家上图 Activity生命周期的切换过程
典型情况下的生命周期分析
1.onCreate:表示Activity正在被创建,在这个方法中我们可以做一些初始化的工作,setContentView去加载界面布局,初始化数据等。
2.onRestart:表示A正在被重新启动,一把情况下,当当前A从不可见变为可见状态时,onRestart就会被调用。一般是用户操作所致,比如
用户按Home回到桌面,或者打开了一个新的A,这时当前的A会执行onPause,onStop,接着用户又回到了这个A,就会调用这个方法。
3.onStart:表示A正在被启动,这时A已经可见了,但是还没有出现在前台,依然还在后台,还无法和用户交互。可以理解为A已经显示出来了,但是我们看不到。
4.onResume:表示A已经可见了,并且出现在前台并开始活动。
5.onPause:表示A正在停止,正常情况下,紧接着onStop会被调用。在特殊情况下,如果这时候快速的再回到当前A,那么onResume会被调用。这是一种极端的情况,
用户操作很难重现这一场景。此时可以做一些存储数据、停止动画等工作,但是不能太耗时,因为这会影响到新A的显示,onPause必须执行完新A的onResume才会执行。
6.onStop:表示A即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
7.onDestroy:表示A即将被销毁,这时A生命周期中的最后一个回调,在这里,我们可以做一些回收工作和最终资源的释放。
具体情况说明
1.针对一个特定的A启动,回调如下:onCreate -> onStart -> onResume
2.用户打开新A或者切换到桌面时 onPause -> onStop 这里有一种特殊情况,如果新A采用了透明主题,那么当前A不会回调onStop
3.当用户再次回到原A时,回调如下:onRestart -> onStart ->onResume
4.当用户按back键回退时,回调如下:onPause -> onStop ->onDestroy
5.当A被系统回收再次打开时,生命周期方法回调过程跟1一样,只是生命周期方法一样,不代表所有过程一样。
6.从整个生命周期来说,onCreate跟onDestroy是配对的,分别标识着A的创建和销毁,并且可能又一次调用。从A是否可见来说,onStart跟onStop是配对,随着用户的操作
或者设备屏幕的点亮熄灭,这两个方法会调用多次;从A是否在前台来说,onResume和onPause是配对的,随着用户的操作或者设备屏幕的点亮熄灭,这两个方法会调用多次。
问题1:onStart和onResume,onPause和onStop从描述上看来差不多,有什么实质上的不同呢?
根据上面的分析,这两个配对的回调分别表示不同的意义,onStart onStop是从A是否可见,而onResume onPause是从A是否位于前台,除了这种区别,在实际使用中
没有其他明显区别。
问题2:当前的Activity为a,新打开的Activity为b,那么b的onResume跟a的onPause那个先执行呢?
答案是onPause,官网对onPause的解释有这么一句,不能再onPause中做重量级的操作,因为必须A的onPause执行完成新的A才能onResume.所以我们尽可能将操作至于onStop从而使新的A尽快的执行onResume到达前台。
异常情况下生命周期分析
情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建
资源相关的系统配置发生改变:比如,当我们把图片放入drawable目录后,就可以通过Resource来访问,为了兼容不同的设备我们需要在一些目录放置不同的图片,
例如drawable-mdpi drawable-land等,这样系统就会根据当前设备的情况去加载合适的Resource文件。比如,横屏手机跟竖屏手机会拿到两张不同的图片(设置了landscape或者
portrait状态下的图片),这时当我们旋转手机,默认情况下,A会被销毁后重建。
当系统配置发生改变后,系统会调用onSaveInstanceState来保存当前A的状态,这个方法的调用发生在onStop之前,他与onPause没有时序联系,值得强调一点:这个方法只会出现在A被异常终止的情况下,正常情况下系统不会回调这个方法。当A被重新创建后,系统会调用onRestoreInstanceState,发生在调用onStart之后,并且把A销毁时onSaveInstanceState方法所保存的Bundle对象作为参数传递给onRestoreInstanceState和onCreate方法。因此,我们可以通过onRestoreInstanceState和onCreate方法来判断A是否被重建,如果被重建,取出保存的数据并恢复。
其onSaveInstanceState方法会在什么时候被执行,有这么几种情况:
1、当用户按下HOME键时。这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
2、长按HOME键,选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从activity A中启动一个新的activity时。
5、屏幕方向切换时,例如从竖屏切换到横屏时。在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行
总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则 onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。
至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和 onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提 是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行
另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。
情况2:资源内存不足导致低优先级的A被杀死
Activity的优先级:
1.前台A:正在和用户交互的A,优先级最高。
2.可见但非前台A:比如A弹出了一个对话框,导致A可见但是位于后台无法和用户直接交互。
3.后台A:已经被停止的A,比如执行了onStop,优先级最低。
当系统内存不足时,系统会按照上述优先级去杀死目标A所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。
如果一个进程没有四大组件在执行,那么这个进程很快会被系统杀死,因此,一些后台工作不适合脱离四大组件独自运行在后台中,这样进程很容易被杀死。最好将后台工作放入Service从而保证进程有一定的优先级,这样不会轻易的被系统杀死。