Activity生命周期分析

注:内容来自任玉刚的《Android开发艺术探索》

1,onCreate: 表示Activity正在被创建,这是生命周期的第一个方法。在这个方法中可以做一些初始化工作,比如使用setContentView方法去加载布局、初始化Activity的数据等。

2,onRestart:表示Activity正在重新启动。一般情况下,当Activity从不可见状态转变为可见状态时会调用onRestart方法。这种情形一般是用户行为所导致的,用户按home键回到桌面或者打开了一个新的Activity,这时当前Activity就会暂停,也就是onPause和onStop方法被执行了,当用户再次回到这个Activity,就会出现这种情况。

3,onStart:表示Activity正在被启动,即将开始,这时Activity已经可见了,只不过处于后台没有出现在前台,不能和用户交互。这个时候可以理解为Activity已经显示出来了,但是看不到。

4,onResume:表示Activity已经可见了,并且出现在前台并开始活动。要注意这个和onStart的对比,onStart和onResume都表示Activity已经可见,但是onStart的时候Activity还在后台,onResume的时候Activity已经处于前台了。

5,onPause:表示Activity正在停止,正常情况下,紧接着onStop就会被执行,在特殊情况下,如果快速的返回这个Activity,onResume就会被执行。这是一种极端情况,一般不做考虑,因为用户操作的情况下很难出现。此时可以做一些数据存储、停止动画等工作,但是不能太耗时,不然会影响新Activity的显示。因为必须等onPause执行完,新的Activity的onResume才会执行。所以,切换Activity的时候永远是旧的Activity先看不见(切换到后台)新的Activity才能看得见(出现在前台)。

6,onStop:表示Acti即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。

7,onDestory:表示Activity即将被销毁,这是Activity生命周期中的最后一个回调,在这里,我们可以做一些回收工作和最终的资源释放。


问题1:onStart和onResume,onPause和onStop从描述上看差不多,有什么实质的不同?

答:onStart和onStop是从Activity是否可见这个角度来回调的,onResume和onPause是从Activity是否在前台这个角度来回调的,除了这点在实际使用中没有明显的区别。

问题2:假设当前Activity为A,如果用户这时打开一个新的Activity B,那么B的onResume和A的onPause哪个先执行?

答:通过分析源码发现,在新的Activity启动之前,栈顶的Activity需要先onPause后,新Activity才能启动,也就是就得Activity的onPause先调用。Android官方文档对onPause的解释有这么一句:不能走onPause里面做重量级的操作,因为必须onPause执行完成后新的Activity才能onResume。


异常情况下的生命周期分析:

1,资源相关的系统配置改变导致Activity被杀死并重新创建

        拿简单的图片来说明,当我们把图片放到drawable目录后就可以通过Resource去获取这张图片。同时为了兼容不同的设备,我们可能还需要在其他一些目录放置不同的图片,比如drawable-mdpi、drawable-hdpi等,这样,当应用程序启动时,就会根据当前设备的情况去选择合适的资源,比如横屏时会去取landscape文件夹里面的图片,竖屏时会去取portrait文件夹里面的图片。如果当前Activity处于竖屏的情况下翻转屏幕,这时由于系统配置发生了改变,在默认情况下Activity会被销毁然后重建。生命周期:Activity-->>发生意外-->>onSaveInstanceState-->>onDestroy     重新创建:Activity-->>onCreate-->>onRestoreInstanceState。

        当系统配置发生改变后,Activity会被销毁,onPause、onStop、onDestroy都会被调用,同时由于Activity是在异常情况下停止的,系统会调用onSaveInstanceState方法来保存当前Activity的状态。这个方法的调用时机是在onStop之前,他和onPause没有既定的时序关系,可能在onPause之前也可能是之后。需要注意的是,这个方法只可能在Activity被异常终止的情况下调用,正常情况下是不会调用这个方法的。当Activity被重建时,会调用onRestoreInstanceState方法,Activity销毁时通过onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate。因此我们可以通过onCreate和onRestoreInstanceState方法来判断Activity是否被重建了,如果重建了那么我们就可以取出之前保存的数据并恢复,从时序上来讲onRestoreInstanceState的调用时机在onStart之后。

        同时要知道,在onSaveInstanceState和onRestoreInstanceState方法中,系统自动为我们做了一些恢复工作。当Activity在异常情况下重建时,系统会默认为我们保存当前的视图结构,并且在Activity重建后为我们恢复这些数据,比如文本框的输入内容、ListView的滚动位置等。

2,内存不足导致低优先级的Activity被杀死

        Activity优先级从高到低分为三种情况:

(1)前台Activity----正在和用户交互的Activity,优先级最高

(2)可见并非前台的Activity----比如Activity中弹出了一个Dialog,导致Activity可见,但是不能和用户交互。

(3)后台Activity----已经被暂停的Activity,比如执行了onStop的Activity。

当系统内存不足时会按照上面的顺序去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。如果一个进程中没有四大组件,那么这个进程很容易被杀死,因此一些后台工作可以放到Service里面去执行,在Service里面执行会提高进程的优先级,不会轻易被系统杀死。

如果不想让Activity在旋转屏幕的时候重建,可以给configChanges属性添加orientation这个值:android:configChanges="orientataion",需要注意的是,如果minSdkVersion和targetSdkVersion有一个大于13的,为了防止屏幕旋转导致Activity重启,除了orientation还要加上screenSize。因为minSdkVersion和targetSdkVersion只要有一个大于13,旋转屏幕时都会导致Activity重建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值