主要介绍Activity的生命周期,Activity作为四大组件最常见,且使用最频繁的一个组件,在正常情况下,除了Window,Dialog和Toast,我们能见到的界面只有Activity。
1.Activity生命周期全面分析:
生命周期主要分成两部分:典型情况下的生命周期和异常情况下的生命周期。
1.1 典型情况下的生命周期:是指在有用户参与的情况下,Activity所经过的生命周期的改变。
在正常情况下,Activity会经历如下生命周期:
(1)onCreate:表示Activity正在被创建,这是生命周期的第一个方法。在这个方法,可以做一些初始化工作,比如加载界面布局资源(setContentView),初始化Activity所需要的数据等。
(2)onStart:表示Activity正在被启动,Activity的状态变成了可见,但是还没有到前台的状态,不可与用户交互。(可以理解为Activity已经显示出来,但用户还看不到,还处于后台的意思)
(3)onRestart:表示Activity正在重新启动,一般情况下,当当前Activity从不可见重新变成可见状态时,onRestart就会被调用到,这种情况一般是由用户行为导致的,比如用户点击Home键切换到桌面或者用户打开了一个新的Activity,这时当前的Activity就会暂停(onPause和onStop被执行),接着用户又回到了这个Activity,就会调用到onRestart方法。
(4)onResume:表示Activity已经可见,并且出现在前台开始活动。(onResume和onStart对比,onStart和onResume都表示Activity可见,两个的区别:onStart时Activity在后台,onResume时Activity显示在前台,可与用户交互)
(5)onPause:表示Activity正在停止,正在情况下,紧接onStop就被调用。在特殊情况下,如果这个时候快速地再回到当前Activity,那么onResume会被调用。(这种情况属于极端情况,用户操作很难重现这一场景,这里可以做一些存储数据,停止动画等工作,但是不能做很耗时的工作,因为会影响到新Activity的显示,onPause必须先执行,新Activity的onResume才会执行)
(6)onStop:表示Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
(7)onDestory:表示Activity即将被销毁,这是Activity生命周期中的最后一个回调,可以做一些回收工作和最终的资源释放。
有几种常见的回调情况:
1.针对一个特定的Activity,第一次启动:
onCreate -> onStart -> onResume。
2.当用户打开一个新的Activity或者切换到卓main的时候:
onPause -> onStop。
这里有一个特殊情况就是,如果Activity采用了透明主题,那么Activity不会回调onStop。
3.当用户再次回到原Activity时:
onRestart -> onStart -> onResume
4.当用户按back键回退时:
onPause -> onStop -> onDestory
5.当Activity被系统回收后再次打开,生命周期方法回调过程和1一样。(只是生命周期方法一样,不代表所有过程一致)
需要注意:
1.从整个生命周期来说,onCreate和onDestory是配对的,分别标识着Activity的创建和销毁,并且可能只有一次调用;从Activity是否可见来说,onStart和onStop是配对的,随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次;从Activity是否在前台来说,onResume和onPause是配对的,随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次。
2.Android官方文档对onPause的解释有这么一句话,不能在onPause中做重量级的操作,必须onPause执行完后新Activity才能Resume。这就是为啥不能再onPause和onStop都不能执行耗时操作,尤其是onPause,这也意识到,应当在onStop中做操作,从而使得新Activity尽快显示出来并切换到前台。
1.2 异常情况下的生命周期
异常情况主要指的是Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建,异常情况下的生命周期的关注点和典型情况下略有不同。
(1)资源相关的系统配置发生改变导致Activity被杀死并重新创建。
当我们把一张图片发放在drawable目录后,就可以通过Resouces去获取这张图片,同时为了兼容不同的设备,可能还需要在其他一些目录防止不同的图片,比如drawable-mdpi,drawable-hdpi等,这样,当应用程序启动时,系统就会根据当前设备取得情况去加载合适的Resouces资源,比如说横屏手机和竖屏手机会拿到两张不同的图片,(设定了landscape或者portraint状况下的图片)比如说当前Activity处于书评状态,如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,Activity就会被销毁并且重新创建,当然我们也可以阻止系统重新创建我们的Activity。
(2)资源内存不足导致低优先级的Activity被杀死
Activity按照优先级从高到低,可以分成以下三种:
1.前台Activity--正在和用户交互的Activity,优先级最高。
2.可见但非前台Activity--比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户直接交互。
3.后台Activity--已经被暂停的Activity,比如执行了onStop,优先级最低。
当系统内存不足的时候,系统就会按照上述优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。
注意:如果一个进程没有四大组件在执行,那么这个进程很快被系统杀死,因此,一些后台工作不适合脱离四大组件而独自运行在后台中,这样子进程容易被杀死,最好的方法是将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易的被系统杀死。
1万+

被折叠的 条评论
为什么被折叠?



