新的一年,借着假期空闲,不想再躺尸做一条咸鱼,故准备着手秋招。该系列分享了我学习移动端开发的一些重要的笔记,大约有Java,Android,Flutter等相关内容,在科研之余多学一些技术,同时第一次分享拙见,还望看到的大佬们还多提宝贵意见。
由于本人本科主语言是java,一些java基础的东西就直接跳过了。再贴一下我的参考书籍是《第一行代码(第二版)》,《android开发艺术探索》,《Android自定义控件开发入门与实战》。
第一次写当然是介绍一下Android中Activity的生命周期了,这也都是老生常谈的话题。Activity是最基本的组件,我们手机上看到的界面大多都是由Activity构成。Activity的生命周期分两种情况:第一种是典型情况下的生命周期,第二种是异常情况下的生命周期。它们的解释分别如下:
典型情况下的生命周期:指在有用户参与的情况下,Activity所经过的生命周期改变。
异常情况下的生命周期:指Activity被系统回收或者由于设备的配置导致Activity被销毁重建。
接下来我将分别介绍一下这两种情况下的活动生命周期。
1.典型情况下Activity会经历如下生命周期:
(1).onCreate(): Activity正在被创建。做初始化工作,例如调用setContentView加载界面布局,初始化Activity所需数据。
(2).onStart(): Activity正在启动。Activity已经可见但没有出现在前台,无法和用户交互。
(3).onRestart():表示Activity重新启动。正常情况下,当Activity从不可见变成可见时,onRestart()就会被调用。情景一般为用户行为所致,导致当前Activity暂停,onPause()和onStop()被执行。当又回到该Activity时,onStart()被调用。
(4).onResume(): Activity已经可见,并且出现在前台并开始活动。
(5).onPause(): Activity正在停止,正常情况下onStop()会被立即调用。特殊情况下快速回到当前Activity, onResume()被调用。应用场景:数据存储,停止动画等。onPause()必须先执行完,新Activity的onResume()才会执行。
(6).onStop(): Activity即将停止,做一些微量级的回收工作。
(7).onDestroy(): 表示Activity即将被销毁,做一些回收工作和资源释放。
在日常使用手机时往往都会经历下面的场景,因此下面是按照应用场景分析Activity的周期。
(1).当第一次启动Activity时,回调过程如下:onCreate()->onStart()->onResume().
(2).当用户打开新的Activity或切换至桌面,回调如下:onPause()->onStop().
(3).当用户再次回到原Activity时,回调如下:onRestart()->onStart()->onResume().
(4).当用户按back键回退时,回调如下:onPause()->onStop()->onDestroy().
(5).当Activity被系统回收后再次打开,回调过程如下:onCreate()->onStart()->onResume().
【注】几点方法的说明:
(1).onCreate()和onDestroy()是配对的,表示Activity的创建和销毁,并且只一次调用。
(2).onStart()和onStop()从Activity是否可见角度回调的,onResume()和onPause()是从Activity是否位于前台角度回调的。
(3).在新的Activity启动前,栈顶的Activity需要先onPause后,新Activity才启动。这基于android的源码,有兴趣可自行查阅。
2.异常情况下Activity会经历如下生命周期:
何谓异常情况,在这里我们分析资源相关的系统配置发生改变,或者系统内存不足这两个例子。当上述情况在应用场景中发生时,Activity可能会被杀死。
(1).资源相关的系统配置发生改变导致Activity被杀死并重建.
举例来说,android中经常会有横屏和竖屏的场景,那么在该场景中,系统会根据当前设备的情况加载合适的Resource资源,例如图片等。当Activity处于竖屏,此所若突然旋转屏幕,由于系统配置发生改变,在默认情况下,Activity就会被销毁并重建。
当系统配置发生改变,Activity会被销毁,其onPause(),onStop(),onDestroy()均会被调用,系统会调用onSaveInstanceState()方法来保存当前Activity的状态,时机在onStop()之前。onSaveInstanceState()方法只会出现在Activity被异常终止的情况下。当Activity被重新创建后,系统会调用onRestoreInstanceState()方法,并把onSaveInstanceState()保存的Bundle对象作为参数同时传递给onRestoreInstanceState()和onCreate()方法,我们可以通过onRestoreInstanceState()和onCreate()方法来判断Activity是否被重建。若被重建,则取出之前数据进行恢复,从时机上说onRestoreInstanceState()调用在onStart()之后。
onSaveInstanceState()和onRestoreInstanceState()会做一定的恢复工作,保留视图结构和数据。当Activity正常销毁时,系统不会调用onSaveInstanceState(),因为被销毁的Activity不可能再次被显示。
(2).资源内存不足导致低优先级的Activity被杀死。
系统内存不足时,系统会按照上述优先级杀死目标Activity所在的进程,并通过onSaveInstanceState()和onRestoreInstanceState()存储恢复数据。如果一个进程没有四大组件执行,则该进程很快被系统杀死,因此一些后台工作不适合脱离四大组件而独自运行在后台的进程很容易被杀死。故将后台工作放入Service中保证进程有一定的优先级。这样不会轻易被系统杀死。
【注】Activity优先级划分:
(1).前台Activity——正在和用户交互的Activity,优先级最高。
(2).可见但非前台Activity——比如弹出的对话框后,后面存在的无法与用户交互的Activity,优先级其次。
(3).后台Activity——已经被暂停的Activity,执行了onStop(),优先级最低。
这里只是归纳总结了Activity的生命周期,需要更深了解或是想亲身体验一下的话当然是写一写关于Activity生命周期的代码,并阅读android相关源码。你会发现不一样的天地。