Android开发之Activity以及View的生命周期详解

关于activity和View的生命周期,网路上已经有很多详细的解释了。并且有一副很经典的示意图,简单地就能百度到,我这里就不放上去了。这里我针对网路上的有些没有讲到的,或者有些误区,然后结合两者说下。

1onCreate(Bundle savedInstanceState)和onFinishInflate()

从字面上都可以看出,onCreate是activity的创建回调,一般我们会把setContentView(R.layout.activity_main)放在oncreate方法里面,这个方法是做了什么呢?主要是将xml布局文件里的控件映射到activity里面。
而View首先会执行构造方法,然后会回调onFinishInflate()方法来完成初始化。
值得注意的是,如果这个activity没被销毁或者没被回收,那么oncreate方法只会执行一次。

2 onStart()和onResume(),onRestart
onMeasure,onLayout,onSizeChanged

为什么把这三个方法放到一起呢?因为这三个方法的意义其实是一样的,只是对应的场景不同,onStart()是指开始运行,onResume()是指被激活,从不可见的状态到可见状态会调用onRestart和onStart(),而从失去焦点的状态到重新获取焦点的状态则会调用onResume();
值得注意的是,onStart()的下一步肯定是onResume()。

而在activity获取焦点过后,即onResume执行完毕后,View则会相应地调用onMeasure测量自身的大小,如果这时view的size发生了变化,则会继续调用onSizeChanged,接着则调用onLayout计算放置在父布局中的位置,如果view是viewgroup,onMeasure和onLayout都会从下往上递归调用。

3 onWindowFocusChanged和onDraw
当activity已经准备好运行了,即onResume调用完后,而view此时也已经测量布局好了,即那么此时view就会调用onDraw来绘制界面,而activity则会调用onWindowFocusChanged,即焦点改变,如果是第一次创建,就是获取到焦点时调用。

4 onPause,onStop,

当activity从可见状态变为不可见状态时,会调用onStop,当activity从有焦点状态到失去焦点时,则调用onPause;

5 onDestroy和onDetachedFromWindow

当activity被主动销毁(不是被回收)的时候 会调用onDestroy,与之对应的,当view从activity解绑的时候则会调用onDetachedFromWindow;

6.onSaveInstanceState和onRestoreInstanceState

这个方法我要重点说明一下,网路上有很多误区,都是人为当activity被回收的时候 会调用onSaveInstanceState,但是实际上activity如果真的因为系统内存不足而被回收的话,系统是根本没有时间也不会考虑去调用这个方法的。
那到底何时会调用它呢?
当系统认为这个activity可能会被回收的时候则会去调用。
注意是可能!
比如 我们按home键回到主界面,这个时候,系统通过你这个操作判断aciticy已经切换到后台,说明这个在接下来的时间里这个activity是可能被回收掉的,这个时候则会调用onSaveInstanceState。
其实这个时候 onRestoreInstanceState这个方法的意义就不大了,因为如果activity实际上没有被回收,那么我们当然用不着调用这个方法来恢复数据啦,如果真的被回收了,我们可以在oncreate方法里面进行判断。

注意:如果activity真的被回收掉了,是不会执行onDestroy方法的,而且我们再次进入的时候,它便会再次执行oncreate方法重新创建,我们可以通过Bundle savedInstanceState这个键值对是否为null来判断这个activity是第一次创建还是被回收再创建的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值