Android常考问题(9)- Activity生命周期

面试android几乎必被问到的问题,Android的生命周期。先把最基础的路径死记下来:

onCreate、onRestart 、onStart、onResume、onPause、onStop、onDestroy

一个activity的生命过程就这么长。写安卓的第一行hello world就是在onCreate方法里面写的,从创建(create),到启动(start),到展示(resume),到隐藏(pause),到停止(stop),最后被干掉(destroy),中间可能还会重启(restart)。

创建(create):我们的很多界面加载啊,主进程啊等等都写在onCreate里面,这个方法就是在创建一个activity,因此我们需要调用数据啊,加载页面啊,等等活都要在这个方法里面完成。

启动(start):这个方法出现了,说明整个onCreate已经走完了,可以说activity已经是加载出来的状态。但是它没有被我们看到,也没有和用户的交互能力(在前台的activity你就可以点击了),但是,它是可见的。就是说他已经是个成形的存在了,你可以把它拿出来仔细观摩的那种“可见”

展示(resume):翻译成展示是为了表示它的意义,这个时候这个activity是可见的了,在start的时候activity相当于在后台,现在它是在前台了,你看到的activity就是这个时候出来的。这个时候相当于已经让他到了前台。

隐藏(pause):这个翻译同样为了理解,这时候activity没有被干掉,也没有被干掉的打算。到了这个方法,说明这个activity又回到了后台。正好和展示(resume)相反。这里可以去停止线程啊,停止动画啊之类的,但是别太耗时间,这个方法是新的activity的启动关键。

停止(stop):到了这里,这个activity就要准备随时被干掉了,因此就不可见了,相当于启动(start)的相反。这里就可以做一些比较重量级的工作了,但是也不能太耗时。

销毁(destroy):这个时候,就可以把activity干掉了,最后的资源释放啊,回收啊之类的工作,在这里解决就好了。

不提restrat了,这个比较特殊,在场景中统一讲一下。

接下来看一下正常流程:

创建(create)了activity之后就启动(start)到后台去,已经可以看到了,然后展示(resume)到前台可见的位置,等你按下back的时候,会调用隐藏(pause)方法让它回到后台,而且会立刻使用停止(stop)让它离开后台并准备销毁(destroy)它。但是如果不是按下back,而是按下home,并快速再次打开应用这时候应用其实并不会关闭再打开,因为在极端情况下它隐藏(pause)了之后还没有停止(stop),然后再打开的时候直接就展示(resume)了。但是如果按下home过了一会再打开,就是从停止(stop)回来,就会进行重启(restart)过程,然后回到启动(start),继续原来的流程。因为停止之后,也不会立刻就干掉activity。

一个应用启动:onCreate -> onStart -> onResume

打开新的activity或者回到桌面的时候:onPause -> onStop   (注意只有在不可见的时候才会有onStop,如果新的activity是透明的,那就可见了,那就不会有onStop了)

回到原来的activity的时候:onRestart -> onStart -> onResume

按下back干掉activity:onPause -> onStop -> onDestroy

从A打开新的activity  B的时候,会是这样的过程:A到B的时候:A onPause ->  B onCreate  -> B onStart -> B onResume -> A onStop

因此在上面我们说A 的onPause不能做耗时操作,因为这样会让B出来的慢,A的onStop也不要太耗时,因为会影响B的速度。

如果出现了意外使得A被杀掉了呢?最常见的就是从竖屏转成横屏的时候,activity其实就是被杀掉了的,这种杀掉,同样会触发onPause -> onStop -> onDestroy。但是作为被异常杀死的,在onStop之前,onPause之前或者之后,就会调用一个方法叫onSaveInstanceState(),它保存了当前Activity的状态,然后当Activity被重新创建的时候,他就把保存的Bundle对象传给onRestoreInstanceState()方法和onCreate() 方法,在Activity被重建后就可以直接恢复activity的数据。onRestoreInstanceState()方法是在onStart之后调用的。每个不同的view有自身的onSaveInstanceState()方法,因此可以保存自身的数据。

保存恢复数据的流程:Activity调用onSaveInstanceState()保存数据,然后告诉Window去保存数据,window就去通知最顶层的viewGroup:DecorView(在View的绘制有介绍),然后一层层再向下通知各个view保存自身的数据。(委托下层的思想,和事件分发,view的绘制等等都是类似的思想)。恢复的时候onRestoreInstanceState()或者onCreate都可以恢复数据,但是官方建议onRestoreInstanceState(),因为它的参数Bundle一定有数据。

内存不足首先被干掉的就是已经onStop的后台不可见的activity,然后是后台可见的,也就是onPause的,最后才是前台的activity。如果一个进程不依附于四大组件,就死得很快了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值