目录:
[TOC]
1、生命周期方法
-
onCreate()
触发时机:当Activity第一次启动的时候。
作用:完成Activity的初始化工作(包括视图的创建,数据的绑定等等)。
注意:该方法的参数(Bundle savedInstanceState),savedInstanceState是通过调用onSaveInstanceState()保存下的状态信息。如果它为null,系统则是创建一个新的Activity实例,而不是恢复之前被Destory的Activity。 -
onRestart()
触发时机:当处于停止状态的Activity需要再次展现给用户的时候。
执行时机:在onCreate()之后,onStart()之前执行。
作用:执行一些特殊的恢复(restoration)工作,请注意之前是被stopped而不是destrory。 -
onStart()
触发时机:所属活动将被展现给用户。
作用:比较好的地方来验证某些必须的系统特性是否可用,例如广播等。 onStop()里面做了哪些清除的操作,就该在onStart()里面重新把那些清除掉的资源重新创建出来。 -
onResume()
触发时机:当Activity和用户发生交互的时候。
作用:初始化那些在onPause()方法里面释放掉的组件,并执行那些activity每次进入onResume()都需要的初始化动作 (例如开始动画与初始化那些只有在获取用户焦点时才需要的组件)。 -
onPause()
触发时机:当一个Activity失去系统焦点后,当另一个Activity启动时或返回前一个Activity时。
作用:停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费;
提交在用户离开时期待保存的内容(例如邮件草稿);释放系统资源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何会影响到电量的资源。
注意:无论什么原因导致Activity停止,系统总是会在onStop()之前调用onPause()方法。 -
onStop()
触发时机:当一个Activity不再需要展示给用户的时候。
作用:Activity不再可见,并且应该释放那些不再需要的所有资源,从而避免内存泄漏。
注意:如果内存紧张,系统会直接结束这个Activity,而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做,而不是onStop时做。在一些情况下,onPause方法或许是Activity触发的最后的方法,因此需要在这个时候保存需要保存的信息。 -
onDestory()
触发时机:当Activity销毁的时候。
作用:最后去清除那些可能导致内存泄漏的地方。因此需要确保那些线程都被destroyed并且所有的操作都被停止。
注意:onDestory()和 onStop()一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。 -
onRestoreInstanceState()
触发时机:只有在Activity销毁重建的时候。
执行时机:会在onStart()和onResume()之间执行。
作用:恢复异常关闭时保存的数据。 -
onSaveInstanceState()
触发时机:当跳转Activity或应用遇到意外情况(内存不足,用户直接按home键)由系统直接销毁Activity时。
执行时机:会在onPause()或onStop()之前执行。
作用:系统调用该方法,允许Activity保存之前的状态,例如:EditText 组件中的文本或 ListView 的滑动位置。
2、生命周期的三种分类
-
完整生命周期(Entire lifetime)
onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy() -
可见生命周期(Visible lifetime)
onStart() -> onResume() -> onPause() -> onStop() -
前台生命周期(Foreground lifetime)
onResume() -> onPause()
3、生命周期方法启动顺序
-
常规启动
onCreate()—>onStart()—>onResume() -
当另一个Activity启动时
Activity_1 onPause() —>
Activity_2 onCreate() —> onStart() —> onResume() —>
Activity_1 onStop() -
当返回到之前Activity时
Activity_2 onPause() —>
Activity_1 onRestart() —> onStart() —> onResume() —>
Activity_2 onStop() —> onDestroy()
4、生命周期方法销毁顺序
-
异常销毁
onPause() —> <Process Killed> -
异常销毁
onPause() —> onStop() —> <Process Killed> -
正常销毁
onPause() —> onStop() —> onDestroy()
5、Activity的四种状态
-
活动状态(Runing)
处于栈顶,处于可见并可和用户交互的激活状态。
活动状态触发的函数及顺序为:
onCreate() —> onStart() —> onResume()。 -
暂停状态(Paused)
当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。
活动状态到暂停状态所触发的函数及顺序为:
onResume() —> onPuased()。
暂停状态恢复至活动状态所触发的函数及顺序为:
onPuased() —> onResume()。 -
停止状态(Stoped)
当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于 Stoped 状态。
暂停状态到停止状态所触发的函数及顺序为:
onPuased() —> onStop()。
停止状态恢复至活动状态所触发的函数及顺序为:
onStop() —> onRestart() —> onStart() —> onResume()。 -
死亡状态(Killed)
Activity 被系统杀死回收或者没有被启动时处于 Killed 状态。
停止状态到死亡状态分为两种情况:
情况一:由用户操作导致,则执行onStop() —> onDestroy()。
情况二:由系统自动强制执行,则该Activity被强行结束。
6、Back键与Home键区别
-
Back键
默认行为是finish处于前台的Activity,即Activity的状态为Destroy状态为止,若再次启动该Activity是从 onCreate()开始,不会调用onSaveInstanceState()。 -
Home键
默认行为是Stop处于前台的Activity,即Activity的状态为Stop状态为止,而不是Destroy。
若再次启动该Activity,会调用onSaveInstanceState() 方法,保持上次Activity的状态则是从OnRestart() —> onStart() —> onResume()。
7、Activity中数据保存与恢复
-
保存数据
onPause(),onSaveInstance(bundle)。 -
恢复数据
onCreate(Bundle), onRestoreInstanceState(budle)。
默认情况下onSaveInstanceSate()和onRestoreInstanceState()会对UI状态进行保存和恢复,如果需要保存其他数据可以在onSaveInstanceState(),onPause()保存。
注意:如果是持久化的数据得通过onPause()保存(google推荐)。
8、Activity的加载模式
-
设置加载模式的两种方法
- Intent对象中设置的Flag;
- AndroidManifest.xml中进行设置,launchMode属性。
-
四种加载模式
-
standard
默认模式,可以不用写配置。可以有多个相同的实例,也允许多个相同Activity叠加。 -
singleTop
可以有多个相同的实例,但不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。 -
singleTask
只有一个实例。启动时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。如果在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,并且允许别的Activity与其在一个task中共存。 -
singleInstance
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
-
standard
9、Activity的栈管理
10、典型问题及解决方案
- 屏幕旋转Activity销毁重建
- 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
- 设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
- 在Android3.2之前,设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。但在Android3.2及其之后,仍会重新调用各个生命周期一次,因为screen size也开始跟着设备的横竖切换而改变。
- Android3.2及其之后,设置Activity的android:configChanges=”orientation|keyboardHidden|screenSize“,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
- 解决方案链接
网友评论