大家好,我是听者,欢迎阅读Android 高级开发笔记系列。
今天给大家带来第一章 Android生命周期探索,当“高级”和“生命周期”一起谈论的时候,也许很多人觉得很“离谱”,其实实际情况不是这样的,的确Android的activity的生命周期是很基础的知识点,但是在很多情况下activity的是不按规矩出牌的,比如Activity被系统收回、Configuration发生改变等。
在正常情况下Activity的生命周期(点击查看)
1)OnCreate:这是Activity生命周期的第一个方法,表示Activity正在被创建,用来加载布局和初始化其本身所需要的数据。
2)OnStart:表示Activity正在被启动,此时Activity已经建立,但是我们还没有看到。
3)OnResume:表示Activity可以看到了,并且可以和用户交互了,其实onstart和onresume时,Activity都已经在后台可见了,只是OnStart我们看不见也不能和用户交互,OnResume可以和用户交互了。
4)OnPause:在正常情况下OnPause之后会紧接着调用onStop,但是当一个Activity类型的Dialog覆盖到该Activity上,该Activity还处于可见的时候,不会调用OnStop。在OnPause不宜执行太多的操作,因为新的activity启动要在该activity执行完OnPause之后才执行OnCreate,如果在OnPause执行耗时操作会影响新activity的创建。
5)OnStop:当Activity执行该生命周期之后,该Activity就处于可被回收状态了,即不稳定状态,这里可以做一些比较耗时的回收工作。
6)OnDestroy:表示该Activity即将被回收,这里我们可以做一些最终的回收任务。
7)OnRestart:表示当处于OnStop的activity重新可见时调用。
下面介绍几种情况下的Activity生命周期的调用:
当启动Activity A(以下简称 “A”)时,将会调用A的OnCreate--->OnStart---->Onresume:
第一种情况:当一个Activity类型的Dialog覆盖到A上时,调用A的OnPause,当该dialog消失时,调用OnResume使得A重写可见。
第二种情况:当A启动Activity B(以下简称“B”)时,先调用A的OnPause在调用B的OnCreate--->OnStart---->Onresume,然后调用A的OnStop;如果在B中触发back键或者调用其finish方法时,先触发B的onPause,然后调用A的OnRestart--->OnStart---->Onresume然后再调用B的OnStop---->onDestroy。
好的,到这里Activity的正常生命周期就基本介绍完了,下面我们就介绍几种非正常状态下的生命周期:
在介绍这个之前我们在介绍Activity的两个方法:onSaveInstanceState和onRestoreInstanceState,onSaveInstanceState方法是当Activity处于不可见状态也就是非活跃状态再通俗点就是调用了OnPause之后(不一定是OnStop之前),此时系统就可能回收该Activity,触发onSaveInstanceState,当Activity被回收后重新创建时,调用onRestoreInstanceState。
Activity异常生命周期分析:
第一种情况:与资源相关的系统配置发生改变,最典型的就是横竖切换时,此时系统就会重绘Activity,当Activity被重新创建的时候就会调用OnCreate-->onRestoreInstanceState--->OnStart---->OnResume,在onRestoreInstanceState中的Bundle取出onSaveInstanceState的Bundle存储的数据来恢复界面,其实有些时候我们并不想重绘Activity的,这有没有办法解决呢?答案肯定是肯定的,当我们在activity的配置文件中指定了其confihChanges属性后就不会再重绘Activity了,例如当我们指定了“ android:configChanges="screenSize | orientation" “在横竖屏切换时就不会重绘Activity了。
第二种情况:当资源内存不足时,低优先级的Activity被回收:
Activity的优先级:处于活动状态的最高,调用了OnPause的次之,调用OnStop的最低。当Activity被重新创建的时候就会调用OnCreate-->onRestoreInstanceState--->OnStart---->OnResume。
好的,今天就介绍到这里,如果有什么疑问,欢迎加入 Android高级开发交流群 群号: 474440973,听者在北京等你!