1.1Activity的生命周期全面分析

典型情况下的生命周期分析:

正常情况下,Activity会经历以下的生命周期:

  1. onCreate():这是Activity生命周期的第一个方法,表示Activity正在被创建,我们可以在这个方法里做些准备工作,比如setContentView(),或者请求Activity所需的一些数据。

  2. onStart():Activity创建出来之后会回调这个方法,表示Activity正在启动,这个时候Activity已经可见了,但是还在后台,还不能和用户进行交互。

  3. onResume():这个时候,Activity已经可见了,并且出现在了前台,可以和用户进行交互了。

  4. onPause():表示Activity正在暂停,这个时候,Activity仍然全部或部分可见,但是已经不在前台了。

  5. onStop():表示Activity正在停止,这个时候Activity已经不可见了,可以在这个方法里做一些不太耗时的资源释放操作。

  6. onDestory():表示Activity即将被销毁,在这里我们可以做一些回收工作和资源的最终释放。

Activity的生命周期可以用下图来表示:

这里写图片描述

这里再附加一下具体说明:

  • Activity如果已经不可见了,这种情况一般发生在跳转到了其他的Activity里,或者用户按Home健回到桌面,但是Activity的onDestory()方法并没有被调用,即Activity还没有被销毁。当用户重新回到该Activity时,那么它会依次调用 onRestart()-> onStart() -> onResume()方法。

    扫描二维码关注公众号,回复: 2658843 查看本文章
  • 如果Activity被系统回收了,当再次打开它时,会重新调用OnCreate()方法。

  • 从整个生命周期来讲,onCreate()和onDestory()是配对的,分别标记着Activity的创建和销毁,并且只可能有一次调用。onStart()和onStop()是配对的,分别标记着Acitvity可见和不可见,随着用户的操作可能被调用多次。onResume() 和onPause()是配对的,分别标记着Acitvity的是否在前台,也有可能被调用多次。

假设当前Activity为MainAcitvity,如果这时用户打开一个新的Activity SecondActivity,那么MainAcitvity 和SecondActivity 的生命周期中的那些方法会被调用呢,调用的顺序如何?

经过实际测试,在每个回调里Log一下,答案是:

这里写图片描述

根据官方的建议,不能在onPause()方法里做重量级的操作,因为上一个Activity的onPause()必须执行完,新的Activity才能onResume()。
我们知道,onPause()和onStop()都不宜做耗时操作,尤其是onPause(),因此应当尽量在onStop()中操作,从而使得新的Acitvity可以尽快显示出来。

异常情况下的生命周期分析:

1. 资源相关配置发生改变导致Activity被杀死并重新创建

在默认情况下,如果我们不做特殊处理,那么当系统配置发生改变后,比如横竖屏切换,Acitvity就会被销毁并重新创建,其生命周期如下图:

  • 当系统配置发生改变后,Actvity会被销毁,其onPause(),onStop()和onDestory方法会依次被调用,而且,系统还会调用onSaveInstanceState(),我们可以在这个方法里做一些状态保存工作。
  • onSaveInstanceState()方法会在onStop()之前调用,注意它和onResume()没有既定前后关系。
  • 在Activity被重新创建后,系统会调用onRestoreInstanceState(),并且把Activity被销毁时onSaveInstanceState()里保存的Bundle对象作为参数同时传给onCreate()和onRestoreInstanceState()。
  • onRestoreInstanceState()会在onStart()之后调用。

2. 资源内存不足导致低优先级的Activity被杀死

当系统内存不足时,系统就会按照优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState()和onSaveInstanceState()来存储和恢复数据。如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死,因此一些后台工作不适合脱离四大组件而独自在后台运行,比较好的方法是将后台工作放在Service中,从而保证进程有一定的优先级。

我们知道,当系统发生改变后,Activity会被销毁并重新创建,那有没有方法不重建呢?

答案是有的,如果我们不想系统重建Activity,可以给Activity指定configChanges属性。比如,不想让Acitvity在屏幕旋转时重新创建,就可以给configChanges属性添加orientation这个值,在AndroidMenifest.xml中的Activity中声明即可。

android:configChanges = "orientation"`

如果想指定多个值,可以用”|“连接起来,比如:

android:configChanges = "orientation|keyboardHidden|locale"

系统配置中所含的项目是非常多的,常见的有:

“mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家;
“mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商;
“locale“ 设备的本地位置发生了改变,一般是用户修改了系统语言;
“keyboard“ 键盘类型发生变化,比如用户接入外部键盘设备;
“keyboardHidden“ 键盘的可访问性发生变化,比如用户调出了键盘;
“orientation“ 设备屏幕方向发生了改变,这个是最长用的,比如用户旋转了手机屏幕;
“fontScale“ 系统字体缩放比例发生改变,比如用户选择了另一个系统字号。

我们可以在Acitvity中复写onConfigurationChanged()方法,在资源配置发生改变时实现自己的逻辑:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    supper.onConfigurationChanged(newConfig);
 }

猜你喜欢

转载自blog.csdn.net/cvStronger/article/details/79070867