Android学习笔记——activity的生命周期

这里写图片描述
任何时候只能有一个 activity处于用户能交互的运行状态。
Activity的子类可以在activity的生命周期状态发生关键性转换时完 成某些工作。这些方法通常被称为生命周期回调方法。


为什么要使用@Override注解吗?
使用@Override注解,就是要求编译器保证当前类拥 有你要覆盖的方法。例如,对于如下拼写错误的方法,编译器会发出警告


设备旋转时,系统会销毁当前QuizActivity实例,然后创建一个新的QuizActivity实例。

旋转设备会改变设备配置(device configuration)。设备配置实际是一系列特征组合,用来描 述设备当前状态。这些特征有:屏幕方向、屏幕像素密度、屏幕尺寸、键盘类型、底座模式以及 语言等。在运行时配置变更(runtime configuration change)发生时,可能会有更合适的资源来匹配新 的设备配置。于是,Android销毁当前activity,为新配置寻找佳资源,然后创建新实例使用这 些资源。

解决方法:保存数据以应对设备旋转
在设备运行中发生配置变更时,若设备旋转,需想个办法保存以前的数据。。覆盖以下Activity 方法就是一种解决方案: protected void onSaveInstanceState(Bundle outState) 该方法通常在onStop()方法之前由系统调用,除非用户按后退键。(记住,按后退键就是告 诉Android,activity用完了。随后,该activity就完全从内存中被抹掉,自然,也就没有必要为重 建保存数据了。

注意,在Bundle中存储和恢复的数据类型只能是基本类型(primitive type)以及可以实现 Serializable或Parcelable接口的对象。在Bundle中保存定制类对象不是个好主意,因为你 取回的对象可能已经没用了。比较好的做法是,通过其他方式保存定制类对象,而在Bundle中 保存标识对象的基本类型数据。


系统随时会销毁掉已停止的activity。不用担心数据丢失,activity停止时,会调用 onSaveInstanceState(Bundle)方法的。所以,解决旋转数据丢失问题,就是抢在系统销毁 activity之前保存数据。

保存在onSaveInstanceState(Bundle)的数据该如何幸免于难呢?调用该方法时,用户数 据随即被保存在Bundle对象中,然后操作系统将Bundle对象放入activity记录中。

为便于理解activity记录,我们增加一个暂存状态(stashed state)到activity生命周期,如图3-14 所示。 activity暂存后,Activity对象不再存在,但操作系统会将activity记录对象保存起来。这样, 在需要恢复activity时,操作系统可以使用暂存的activity记录重新激活activity。 注意,activity进入暂存状态并不一定需要调用onDestroy()方法。不过,onStop()和 onSaveInstanceState(Bundle)是两个可靠的方法(除非设备出现重大故障)。因而,常见的做 法是,覆盖onSaveInstanceState(Bundle)方法,在Bundle对象中,保存当前activity的小的或 暂存状态的数据;覆盖onStop()方法,保存永久性数据,如用户编辑的文字等。onStop()方法 调用完,activity随时会被系统销毁,所以用它保存永久性数据。
这里写图片描述

用户按了后退键后,系统会彻底销毁 当前的activity。此时,暂存的activity记录同时被清除。此外,系统重启的话,暂存的activity记录 也会被清除。

猜你喜欢

转载自blog.csdn.net/qq_40104617/article/details/82527602