Activity是Android应用的重要组成单元之一(另外三个是Service,BroadcastReceiver和ContentProvider),也是最常用的组件。当一个Activity类定义出来之后,这个Activity类何时被实例化,它所包含的方法何时被调用,这些都不是开发者决定的,都应该由android系统决定。在我们创建Activity后,通过setContentView(View)方法给Activity指定一个布局文件。
在Android系统中,有两种操作会启动Activity
1.Launcher启动主程序的Activity(用户点击应用程序图标)。
2.通过代码启动。(调用startActivity等函数)
一.Activity的生命周期
Activity有如下四中状态
1.运行状态:当前Activity位于前台,用户可见,可以获得焦点。
2.暂停状态:其他Activity位于前台,该Activity依然可见,不能获得焦点。
3.停止状态:该Activity不可见,失去焦点。
4.销毁状态:该Activity结束,或其所在线程被结束。
在Activity的声明周期中,调用方法如下
onCreate(Bundle savedStatus):创建Activity时被调用,它是生命周期的第一个被调用的方法,该方法只会被调用一次,在创建Activity时一般都会重写该方法,在该方法中实 现一些初始化的操作(初始化布局资源或组件信息)。
onStart():启动Activity时被调用。此时Activity已经处于可见状态,只是还没有在前台显示出来,无法与用户进行交互。
onResume():恢复Activity时调用,在onStart方法后一定会调用该方法。说明Activity已经在前台可见了,可以交互了(处于运行状态)。我们可以在该方法中初始化那些被 onPause()或者onStop()释放掉的资源
onPause():表明Activity正在停止(停止状态),一般情况下,紧接着会调用onStop()方法。通过流程图可知,还有可能执行过onPause方法后再去执行onResume方法,可能是用户使当前Activity到后台后又迅速返回到当前Activity。在onPause中可以做一些数据存储,停止动画或者资源回收,但是不能进行耗时操作,这会影响新的Activity的执行, 因为在onPause方法执行完毕后,新的Activity的onResume方法才会执行。
onStop():一般在onPause后立即执行,停止Activity(停止状态),此时Activity处于后台不可见模式。onStop也可以执行资源的释放,但仍然不能太耗时。
onRestart():重新启动Activity时被调用。当Activity由不可见变为可见时会调用该方法。
onDestroy():这是生命周期的最后一个方法,表示Activity正在销毁(销毁状态),一般在该方法中做资源释放工作。
二.异常周期
一般由两种情况会导致Activity的生命周期异常化
1.相关系统配置发生改变(横竖屏改变,系统语言改变等)。
2.内存不足导致优先级低的Activity被销毁。
配置改变
在异常周期中出现了两个之前没有见过的方法,分别是onSaveInstanceState 和onRestoreInstanceState。
onSaveInstanceState(Bundle outState)
该方法用来保存当前Activity中的信息,该方法必须在onStop方法之前调用。
onRestoreInstanceState(Bundle savedInstanceState)
该方法用来恢复Activity中的信息,在onStart之后调用。
在正常情况下,系统是不会调用这两个方法的,只有在Activity异常终止的时候才会调用。且系统会自动帮助我们恢复一些View相关的数据(例如EditText等)
onCreate(Bundle) 与 onRestoreInstanceState(Bundle)
在Activity异常终止时,系统恢复该Activity会调用onCreate与onRestoreInstanceState,切两者参数都是Bundle类型,那么在两个方法中都可以对数据进行恢复了?
在系统第一次执行生命周期的onCreate方法时,Bundle中并没有任何数据,说明onCreate的Bundle可以为空。但是onRestoreInstanceState的Bundle却不能为空,所以应该在onRestoreInstanceState中进行数据恢复。
内存不足
内存不足会导致系统自动Kill优先级较低的Activity,那么Activity的优先级是如何排列的呢?按照优先级从高到低排列如下
1.前台Activity(正在与用户交互的)
2.可见但非前台(在Activity上弹出对话框的情况)
3.后台Activity