Activity的生命周期

本文摘抄自Android开发艺术探索

Activity生命周期概述

根据关注点不一样,可将Activity生命周期可分典型情况和异常情况两部分:典型情况下的生命周期,是指在有用户参与的情况下,Activity所经过的生命周期的改变;而异常情况下的生命周期是指Activity被系统回收(系统内存不足)或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建

典型情况生命周期

典型情况下,Activity会经历如下生命周期。
(1)onCreate:表示Activity正在被创建,这是生命周期的第一个方法。在这个方法中可以做一些初始化工作,比如调用setContentView去加载界面布局资源、初始化Activity所需数据等。
(2)onRestart:表示Activity正在重新启动。一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart就会被调用。这种情形一般是用户行为所导致的,比如用户按Home键切换到桌面或者打开了一个新的Activity,这时当前的Activity就会暂停,也就是onPause和onStop被执行了,接着用户又回到了这个Activity,就会出现这种情况。
(3)onStart:表示Activity正在被启动,即将开始,这时Activity已经可见了,但是没有出现在前台,还无法和用户交互。这个时候其实可以理解为Activity已经显示出来了,但是我们还是看不到。
(4)onResume:表示Activity已经可见了,并且出现在前台并开始活动。要注意这和onStart的对比,onStart和onResume都表示已经可见,但是onStart的时候Activity还在后台,onResume的时候Activity才显示到前台。
(5)onPause:表示Activity正在停止,正常情况下,紧接着onStop就会被调用。在特殊情况下,如果这个时候快速低再回到当前Activity,那么onResume会被调用,这种情况属于极端情况,用户很难重现这一现象。此时可以做一些停止动画等工作,但是不能太耗时,因为会影响到新Activity的显示,onPause先执行完,新Activity才会启动
(6)onStop:表示Activity即将停止,此时可以做些稍微重量级的回收工作,同样不能太耗时
(7)onDestroy:表示Activity即将被销毁,这是Activity生命周期中的最后一个回调,此时可以做一些回收工作和最终的资源释放。
正常情况下,Activity的常用生命周期就只有上面7个,各生命周期切换过程如下图所示。

这里写图片描述

对于上图,这里再附加说明,分如下几种情况:
(1)针对特定的Activity,第一次启动,回调如下:onCreate->onStart-onResume。
(2)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause->onStop。这里有一种特殊情况,如果新的Activity采用了透明主题,那么当前Activity不会回调onPause
(3)当用户再次回到原Activity时,回调如下:onRestart->onStart->onResume。
(4)当用户按下返回键退出时,回调如下:onPause->onStop->onDestroy。
(5)从整个生命周期来说,onCreate和onDestroy是配对的,分别标识Activity的创建和销毁,并且只可能有一次调用;从Activity是否可见来说,onStart和onStop是配对的;从Activity是否在前台来说,onResume和onPause是配对的。onStart、onResume、onPause和onStop会随着用户操作或者设备屏幕的点亮和熄灭可能被调用多次。

异常情况生命周期

有两种情况会导致异常情况产生:一是资源相关的系统配置发生改变,导致Activity被杀死并重新创建;二是内存资源不足导致低优先级的Activity被杀死。
不管是那种情况导致异常情况的,其数据保存和恢复是一样的,如下所示。

这里写图片描述

(1)资源相关的系统配置发生改变,导致Activity被杀死并重新创建
默认情况下,当系统配置发生变化后,Activity就会被销毁,其onPause、onStop、onDestroy均会被调用,同时由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态。这个方法可能在onPause之前也可能在之后。需要注意的是,这个方法只会出现在Activity被异常终止的情况下,正常情况下系统是不会回调这个方法的。当Activity被重新创建后,系统会调用onRestoreInstanceState,并且吧Activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数传递给onRestoreInstanceState和onCreate方法。因此,我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建了,如果被重建了,则可以取出之前保存的数据并恢复。

onRestoreInstanceState和onCreate两者的区别是:onRestoreInstanceState一旦被调用,其参数Bundle saveInstanceState一定不为null,不用额外判断是否为空;而onCreate如果是正常启动,则其参数Bundle saveInstanceState为null,因此需要额外判断是否为空。

如果要在系统配置发生改变时不重新创建,就需要在AndroidManifest.xml中对应的Activity的android:configChanges属性添加选项,选项可有多个,用“|”分隔开,常用的有orientation和screenSize,如

// 当屏幕旋转和屏幕尺寸发生改变时,不重新创建Activity。
android:configChanges="orientation|screenSize"

示例如下

  <activity 
            android:name=".MainActivity"
            android:configChanges="screenSize|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
  </activity>

同时,可在Activity中重写onConfigurationChanged方法监听配置变化并做特殊处理。
(2)内存资源不足导致低优先级的Activity被杀死
Activity按照优先级从高到低,可以分为三种:
1)前台Activity——正在和用户交互的Activity,优先级最高。
2)可见但并非前台Activity——比如Activity中弹出了一个对话框,导致Activity可见,但是位于后台无法和用户直接交互。
3)后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低。

当系统内存不足时,系统就会按照上述的优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。如果一个进程没有四大组件在执行,则这个进程很快就会被系统杀死。因此将后台工作放到Service中从而保证进程有一定的优先级,就不会轻易被系统杀死

此外,对于异常情况生命周期中view视图的数据保存和恢复:当Activity在异常情况下需要重新创建时,系统会默认保存当前Activity的视图结构,并且在Activity重启后恢复这些数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值