Activity生命周期(二)异常情况

简介: 原文链接 https://mp.weixin.qq.com/s?__biz=MzAxNjg3M...在上一篇文章 Activity生命周期之正常情况 中,分析了正常情况的生命周期的调度,除了用户正常操作所引起的生命周期的变化外,还存在着一些异常情况,比如系统配置的改变或者内存不足的情况,这些情况下,Activity可能被杀死。

原文链接 https://mp.weixin.qq.com/s?__biz=MzAxNjg3M...

在上一篇文章 Activity生命周期之正常情况 中,分析了正常情况的生命周期的调度,除了用户正常操作所引起的生命周期的变化外,还存在着一些异常情况,比如系统配置的改变或者内存不足的情况,这些情况下,Activity可能被杀死。

  1. 相关系统配置改变导致生命周期的变化
    典型的情况就是手机横竖屏的变化,默认情况下,当Activity处于竖屏状态的时候,突然旋转屏幕,Activity会被销毁并且重建,当然我们也可以阻止重新创建Activity(文末提供)。
    默认情况下,如果Activity不做任何处理,系统配置改变后,Activity会被销毁并重新创建。销毁过程,Activity的onPauseonStoponDestroy都会调用,同时由于Activity在异常情况下终止的,系统会调用onSaveInstanceState来保存当前的Activity的状态,这个方法在onStop之前调用。注意 这个方法只在Activity被异常终止的情况下调用,正常情况下Activity是不会调用这个方法。
    当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象传递给onRestoreInstanceStateOnCreate方法。因此我们可以通过onRestoreInstanceStateOnCreate方法来判断Activity是否被重建了,如果是重建,就可以取出之前保存的数据并恢复。onRestoreInstanceState调用在onStart之后。
    销毁至重建的流程:onPause->onSaveInstanceState->onStop->onDestroy->(销毁后重建)onCreate->onStart->onRestoreInstanceState->onResume
    image

    同时,异常情况下终止,会调用onSaveInstanceState来保存当前的状态,并在OnCreateonRestoreInstanceState里恢复数据。
    举个栗子
保存数据
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("test","保存的数据");
    Log.i("》》》A"," onSaveInstanceState 开始保存数据");
}

获取数据
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(savedInstanceState != null){
        String data = savedInstanceState.getString("test");
        Log.i("》》》A"," onCreate 获取的数据:"+data);
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    String data = savedInstanceState.getString("test");
    Log.i("》》》A"," onRestoreInstanceState 获取的数据:"+data);
}
image
  1. 内存不足导致Activity被杀死
    这种情况不好模拟,其数据存储、恢复过程和情况1完全一致。Activity的优先级从高到低可以大致分为一下三种:

    1. 前台Activity——正在和用户交互的Activity,优先级最高。
    2. 可见但非前台Activity——比如Activity中弹出了一个对话框,导致Activity可见但无法和用户直接交互。
    3. 后台Activity——已经被暂停或者停止的Activity,优先级最底。

    当系统内存不足的时候,系统就会按照上述优先级从低到高来杀死目标Activity。并在后续通过onSaveInstance和onRestoreInstance来存储和恢复数据。

以上我们分析了系统的数据存储和恢复机制,当然也有办法让系统不去重建Activity,configChanges属性,比如android:configChanges="orientation|screenSize",这种情况下,当屏幕旋转时,Activity不会被重新创建。
至此,关于Activity在正常情况和异常情况下的生命周期介绍结束了,对Activity的生命周期应该也有了深入的了解了。
欢迎关注我的博客:https://blog.manjiexiang.cn/
欢迎关注微信号:春风十里不如认识你

image.png

目录
相关文章
|
17天前
|
存储 安全 Java
如何避免`ArrayStoreException`异常?
`ArrayStoreException`是在Java中尝试将错误类型的对象存储到泛型数组时抛出的异常。要避免此异常,需确保向数组添加的对象类型与数组声明的类型一致,使用泛型和类型检查,以及在运行时进行类型安全的转换和验证。
|
2月前
|
消息中间件 前端开发 NoSQL
面试官:线程池遇到未处理的异常会崩溃吗?
面试官:线程池遇到未处理的异常会崩溃吗?
73 3
面试官:线程池遇到未处理的异常会崩溃吗?
|
3月前
|
安全 测试技术 数据库连接
如何避免 C# 中的异常
【8月更文挑战第27天】
48 2
|
6月前
|
Android开发
android捕获全局异常,并对异常做出处理
android捕获全局异常,并对异常做出处理
72 4
|
Android开发
为什么会触发ANR,从源码中扒一扒
为什么会触发ANR,从源码中扒一扒
98 0
|
6月前
|
JavaScript IDE Java
bugly崩溃排查3:观察是谁调用了崩溃函数
bugly崩溃排查3:观察是谁调用了崩溃函数
65 0
|
Unix Linux C#
iOS开发:Crash异常总结与捕获
说到异常捕获,就必须要提到Crash问题,iOS中,Crash一般分为两种: 1、一种是由EXC_BAD_ACCESS引起的,原因是访问了不属于本进程的内存地址,有可能是访问已被释放的内存; 2、一种是未被捕获的目标C异常(NSException)记录,导致程序向自身发送了SIGABRT信号而崩溃。
879 0
iOS开发:Crash异常总结与捕获
|
移动开发 小程序 Java
线程池执行过程中遇到异常会发生什么,怎样处理?
线程遇到未处理的异常就结束了 这个好理解,当线程出现未捕获异常的时候就执行不下去了,留给它的就是垃圾回收了。 线程池中线程频繁出现未捕获异常 当线程池中线程频繁出现未捕获的异常,那线程的复用率就大大降低了,需要不断地创建新线程。
744 0
|
C#
WPF异常捕获三种处理 UI线程, 全局异常,Task异常
原文:WPF异常捕获三种处理 UI线程, 全局异常,Task异常 protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);RegisterEvents();} private void RegisterEvents(){//TaskScheduler.
2530 0