Activity 生命周期
是Android程序与用户交互的窗口,从视觉效果来看,一个Activity占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素。从内部逻辑来看,Activity需要为了保持各个界面状态,需要做很多持久化的事情,还需要妥善管理生命周期,和一些转跳逻辑。
(1)一个Activity通常就是一个单独的屏幕(窗口)。
(2)Activity之间通过Intent进行通信。
(3) Android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。
Activity 生命周期应用
onCreate :全局变量的初始化、layout加载
当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。onCreate 方法有一个参数,该参数可以为空(null),也可以是之前调用 onSaveInstanceState() 方法保存的状态信息。
onStart :注册广播
该方法的触发表示所属活动将被展现给用户。
onResume :生命优先级最高
当一个活动和用户发生交互的时候,触发该方法。
onPause :可以保存一些数据
当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。
onStop :可做轻量级的耗时操作,保存数据
当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发 onStop 方法。所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。
onRestart :
当处于停止状态的活动需要再次展现给用户的时候,触发该方法。
onDestroy :释放资源、全局变量置空
当活动销毁的时候,触发该方法。和 onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。
Activity 启动顺序启动一个Activity时:
onCreate()——>onStart()——>onResume()
另一个Activity启动时:
第一个Activity onPause()——> 第二个Activity onCreate()——>onStart()——>onResume() ——> 第一个Activity onStop()
返回到第一个Activity时:
第二个Activity onPause() ——> 第一个Activity onRestart()——>onStart()——>onResume() ——> 第二个Activity onStop()——>onDestroy()
Activity 现场保护
在Activity发生异常的情况才能调用,例如横竖屏切换 onSaveInstanceState 在onPause方法之后调用,我们可以进行数据的保存 onRestoreInstanceState 在重启后onStart方法进行调用,我们可以拿出保留的数据
在清单文件中配置,当切换横竖屏时候不进行 生命周期切换
控制切换横竖屏,生命周期不切换,可以指定Activity android:configChanges="orientation | screenSize | keyboardHidden" 控制屏幕初始化显示方向 android:screenOrientation="landscape" landscape 风景画 横屏 portrait 肖像 竖屏
Activity 四种启动模式
standard: 默认的配置方式,启动配置了该启动模式的界面时,会立即创建一个全新的Activity对象,置于Back Stack的栈顶 singleTop: 启动配置了该启动模式的界面时,会去Back Stack的栈顶查看同类型的界面实例是否存在,若存在,就复用;若不存在,就创建新的界面实例置于回退栈的栈顶。(保证栈顶实例的唯一性) singleTask: 启动配置了该启动模式的界面时,会遍历整个BackStack,查看同类型的界面实例是否存在,若不存在,就构建全新的界面实例置于栈顶; 若存在: 情形1:在栈顶,直接复用。 情形2:不在栈顶,会清除该界面实例之上所有的界面对象,达到将当前界面实例置于栈顶的目的 singleInstance: 启动配置了该启动模式的界面时,会将该Activity界面实例单独置于一个全新的Back Stack中,而且,该回退栈中只保存一个界面实例。此时,若配置了别的启动模式的界面跳转到该界面后,会将存储该界面的Back Stack置于前面,用户就看到了该界面的样子;若该界面启动了别的界面,那么,别的界面所在的回退栈就会置于该界面所在回退栈之前,并且,从别的回退栈中拿出一个界面呈现在用户眼前。(一句话:眼见所看到到永远是某个置于最前方回退栈栈顶的界面实例)