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

2024-04-29 10:58

本文主要是介绍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

同时,异常情况下终止,会调用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);
}


2. 内存不足导致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

这篇关于Activity生命周期(二)异常情况的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/945893

相关文章

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

【Vue】关于Vue3的生命周期

目录 Vue3中新增了一个setup生命周期函数:(1) setup执行的时机是在beforeCreate生命周期函数之前执行,在setup函数中是不能通过this来获取实例的;(2) 为了命名的统一性,将beforeDestroy 改名为 beforeUnmount,destroyed 改名为 unmounted 生命周期函数: setup —— 不能通过this来获

09 生命周期

生命周期 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestorydestoryed 辣子鸡:香辣入口,犹如吃了炫迈一样 - - - 根本停不下来 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport"

Maven生命周期:深入理解构建过程

目录 1. Maven生命周期简介 2. 默认生命周期的阶段 3. 清理生命周期 4. 站点生命周期 5. Maven生命周期的灵活性 6. 结论         在Java开发中,Maven是一个不可或缺的工具,它通过自动化项目的构建、依赖管理和文档生成等任务,极大地提高了开发效率。Maven的核心之一是其构建生命周期,它定义了项目构建过程中的一系列阶段。在这篇文章中,我们将深

【前端】animation动画以及利用vue制作简单的透明度改变动画,包含vue生命周期实现

一. 问题描述 想做一个文字透明度从1到0然后再从0到1的css动画。 二. 代码写法 2.1 animation写法 2.1.1 animation属性key 2.1.2 代码展示 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=de

【C++多线程编程】 线程安全与对象生命周期管理

目录 类的线程安全 实现线程安全  构造函数在多线程中的安全性 析构函数多线程环境的安全 智能指针实现多线程安全  shared_ptr 非完全线程安全 shared_ptr可能导致对象生命周期延长 const引用可以减少传递shared_ptr开销 shared_ptr 智能指针块模块的优点  析构所在线程问题分析  RAII的使用 enable_shared_from_

【ReactJS】通过一个例子学习React组件的生命周期

源代码 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Reac

1.1 Avtivity的生命周期全面分析

本文将Activity的生命周期分为两部分内容,一部分是典型情况下的生命周期,另一部分是异常情况下的生命周期。所谓典型情况下的生命周期,是指在有用户参与的情况下,Activity所经过的生命周期的改变;而异常情况下的生命周期是指在Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建,异常情况下的生命周期的关注点和典型情况下略有不同。 1

LeakCanary测试app内存泄露+registerActivityLifecycleCallbacks管理Activity的生命周期

public class MyApplication extends Application {private String tag = "MyApplication";private static Stack<Activity> activityStack;//检测内存泄露private RefWatcher refWatcher;@Overridepublic void onCreate()

android studio怎么修改创建的Activity的模板?

1.找到android studio的安装目录,如下图,找到对应文件,修改EmptyActivity的模板。 2.修改成如下: 3.新建的EmptyActivity的默认代码如下: