Android面试(2):四大组件之Activity---生命周期

 

全文来自刚哥的《Android艺术探究》
我们这里分成两种情况详细介绍:

一、正常情况下的生命周期:
    所谓正常情况下的生命周期,是指在有用户参与的情况下,Activity所经过的生命周期的改变。

二、异常情况下的生命周期:
    这里的异常情况包括Activity被系统回收或者由于当前设备的Configuration(配置)发生改变,从而引起的Activity生命周期过程。

一、正常情况下的生命周期:

    正常情况下Activity的7种生命周期,如下:

方法名

详细解释

后接方法

onCreate()

表示 Activity 正在被创建,这是生命周期的第一个方法。在这个方法中我们可以做一些初始化工作,比如调用setContentView() 去加载布局界面资源、初始化 Activity 所需数据等等。

onStart()

onRestart()

表示 Activity 正在重新启动。一般情况下,当当前 Activity 从不可见重新变为可见状态时,onRestart 就会被调用。这种情况一般是用户行为所导致的,比如用户按 Home 键切换到桌面或者用户打开了一个新的 Activity,这时当前的 Activity 就会暂停,也就是 onPause 和 onStop被执行了,接着用户又回到原来的 Activity 时,就会出现 onRestart 被调用的情况。

onStart()

onStart()

表示 Activity 正在被启动,即将开始,这时 Activity 已经可见了,但是还没有出现在前台,还无法和用户交互。这个时候其实可以理解为 Activity 已经显示出来了,但是我们还看不见。

onResume()或
onStop()

onResume()

表示 Activity 已经可见了,并且出现在前台并开始活动。要注意这个和onStart 的对比,onStart 和 onResume都表示Activity 已经可见,但是onStart的时候Activity 还在后台,onResume 的时候Activity 才显示到前台。

onPause()

onPause()

表示 Activity 正在停止,正常情况下,紧接着 onStop 就会被调用。在特殊情况下,如果这个时候快速地再回到当前 Activity,那么 onResume 会被调用。这种情况属于极端情况,用户操作很难重现这一场景。此时可以做一些存储数据、停止动画等工作,但是注意不能太耗时,因为这会影响到新 Activity 的显示,onPause 必须先执行完,新 Activity 的 onResume 才会执行。

onResume()或

onStop()

onStop()

表示 Activity 即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。

onRestart()或

onDestroy()

onDestroy()

表示Activity即将被销毁,这是Activity 生命周期中的最后一个回调,在这里,我们可以做一些回收工作和最终的资源释放。

下面是正常情况下 Activity 生命周期回调的几种情况:
1. 针对一个特定的 Activity,第一次启动,回调为: onCreate() -> onStart() -> onResume()。
2. 当用户从当前 Activity 跳转到一个新的 Activity 或者切换到桌面的时候,回调为: onPause() - > onStop()。这里有一种特殊的情况,如果新 Activity 采用了透明主题,那么当前 Activity 就不会回调onStop() 方法。
3. 当用户再次回到原 Activity 时,回调为: onRestart() -> onStart() -> onResume()。
4. 当用户按下 back 键回退时,回调为: onPause() -> onStop() -> onDestroy()。
5. 当 Activity 被系统回收后再次打开,Activity生命周期的回调过程和 1 中的一样,注意这里只是生命周期方法一样,不代表具体过程一样,因为被系统回收就属于异常情况了,可以具体看后面的解释。
6. Activity 的整个生命周期发生在 onCreate() 调用和 onDestroy() 调用之间;Activity 的可见生命周期发生在 onStart() 调用和 onStop() 调用之间;Activity 的前台生命周期发生在 onPause() 调用和 onResume() 调用之间。

Activty生命周期

Activity周期时间

详细说明

整个生命周期

onCreate() -> onDestroy()

您的 Activity 应在 onCreate() 中执行“全局”状态设置(例如定义布局),并在 onDestroy() 中释放所有其余资源。例如,如果您的 Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在 onCreate() 中创建该线程,然后在 onDestroy() 中停止该线程。

可见生命周期

onStart() -> onStop()

在这段时间,用户可以在屏幕上看到 Activity 并与其交互。 例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用 onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在 onStart() 中注册一个 BroadcastReceiver 以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop() 中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart()和 onStop()。

前台生命周期

onPause() -> onResume()

在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台 。 例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。 由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。

 

二、异常情况下的生命周期:

情况1: 资源相关的系统配置发生改变导致 Activity 被杀死并重新创建
    这里先引入源码 Activity.java 中的两个方法:

protected void onSaveInstanceState(Bundle outState) { ... }
protected void onRestoreInstanceState(Bundle savedInstanceState) { ... }

    当系统配置发生改变后 Activity 会回调:
 

public void onConfigurationChanged(Configuration newConfig) {  ...  }


    当系统配置发生改变后,Activity 会被销毁,其 onPause(), onStop(), onDestroy() 均会被调用,同时由于 Activity 是在异常情况下终止的,系统会调用 onSaveInstanceState() 来保存当前 Activity 的状态。这个方法的调用时机是在 onStop() 之前,它和 onPause() 没有既定的时序关系(有可能在它之前也有可能在它之后)。Activity被重新创建后,系统会调onRestoreInstanceState() 方法,并把调用 onSaveInstanceState() 方法所保存的 Bundle 对象作为参数同时传递给 onRestoreInstanceState() 和 onCreate() 方法,因此我们就可以在这两个方法中通过 Bundle 参数为重建的 Activity 恢复数据,从时序来说,onRestoreInstanceState() 的调用时机是在 onStart() 之后。

    在Activity被重建后用过 onRestoreInstanceState() 和 onCreate() 方法都能恢复数据,它们之间的区别是什么?
    答: onRestoreInstanceState() 方法一旦被调用,其 Bundle 类型参数 savedInstanceState 一定是有值的,我们就不用额外的判断它是否为空;但是 onCreate() 不行,onCreate() 如果是正常启动的话,其 Bundle 类型参数 savedInstanceState 为null,所以必须要额外判断。实际这两个方法我们在哪个都可以恢复数据,但是官方文档建议在 onRestoreInstanceState() 方法中恢复。

    注意: 系统只有在 Activity 异常终止的时候才会调用 onSaveInstanceState() 和 onRestoreInstanceState() 方法来存储和恢复数据,其它情况不会触发这个过程。

情况2: 资源内存不足导致低优先级的 Activity 被杀死
    Activty 按照优先级从高到低,可以分为如下三种:
    1. 前台 Activity --- 正在和用户交互的 Activity,优先级最高。
    2. 可见但非前台 Activity --- 比如 Activity 中弹出一个对话框,导致 Activity 可见但是位于后台无法和用户直接交互。
    3. 后台 Activity --- 已经被暂停的 Activity,比如执行了 onStop(),优先级最低。

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

    当然,当系统配置发生改变后,Activity 也可以不被重建。此时我们可以在 AndroidManifest.xml 中为此 Activity 中的 configChanges 属性指定相关值。

android:configChanges="xxx|xxx"

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值