Activity是一个应用程序组件,提供用户与程序交互的界面。
1. Activity的状态
1.1 运行
一个活动位于返回栈的栈顶时,该活动就处于运行状态,Activity处于界面最顶端,获取焦点。
系统最不愿意回收的就是处于运行状态的活动,因为这会带来非常差的用户体验。
1.2 暂停
活动不再处于栈顶,失去焦点,但仍然可见时,该活动就进入暂停状态。
即失去焦点状态。
1.3 停止
当活动不再处于栈顶,且完全不可见时,就进入停止状态(注意和暂停状态的区别),但保留所有状态和成员信息。
注:系统仍然会为这种活动保存相应的状态和成员变量。但这并不完全可靠,当其他地方需要内存时,处于停止状态的活动可能会被系统回收。
1.4 销毁
活动从返回栈中移除后就成了销毁状态。
系统最倾向于回收这种状态的活动,以保证手机内存充足。
2. Activity的生命周期
有七个环节,主要包括七个方法。
2.1 onCreate()
创建活动。
活动第一次被创建的时候调用,且一般会通 setContentView()方法来启动布局文件。
2.2 onStart()
运行活动。
活动由不可见变为可见的时候调用。
2.3 onResume()
活动准备好和用户进行交互时调用(即获取焦点)。
此时的活动一定位于返回栈的栈顶,且处于运行状态。
2.4 onPause()
系统准备去启动或恢复另一个活动时调用(失去焦点)。
注:我们通常会在这个方法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据。但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
2.5 onStop()
活动暂停。活动完全不可见时调用。
注:它和 onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行,而 onStop()方法并不会执行。
2.6 onDestroy()
活动被销毁之前调用,之后活动变为销毁状态。
2.7 onRestart()
活动由停止状态变为运行状态之前调用,即重启活动。
Activity生命周期示意图:
注:以上七个方法中除了 onRestart()方法, 其他都是两两相对的。
从而又可将Activity分为以下三种生存期:
- 完整生存期
onCreate()和onDestroy()之间,即完整生存期。
一般情况下,一个活动会在onCreate()方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操作。 - 可见生存期
onStart()和onStop()之间,即可见生存期。
在可见生存期内,活动对用户总是可见的(即便可能无法和用户进行交互)。 - 前台生存期
onResume()和onPause()之间,就是前台生存期。
在前台生存期内,活动总是处于运行状。此时的活动可以和用户进行相互,我们平时看到和接触最多的也这个状态下的活动。
3. Activity的启动模式
Activity有4种启动模式,可以在 AndroidManifest中通过给 activity 标签指定android:launchMode 属性来选择启动模式。
3.1 standard
默认启动模式。
无论在返回栈中存在与否,每次启动都会创建该活动的一个新的实例。
3.2 singleTop
在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
注:若已存在,但不在栈顶,则创建新的活动。
3.3 singleTask
每次启动该活动时,先在返回栈中检查是否存在该活动的实例,若存在则直接使用该实例,并把在此活动之上的所有活动统统出栈;若不存在则创建一个新的活动实例。
3.4 singleInstance
指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动。
此模式略复杂,以后细谈。
所有的Activity都要在 AndroidManifest.xml 中进行注册才能生效。示例代码:
<activity
android:name=".FirstActivity"
android:label="This is first activity"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/> --若想让FirstActivity作为程序的主活动,就必须加入这两句
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
注:
- Android 中的活动是可以层叠的。我们每启动一个新的活动,就会覆盖在原活动之上,然后点击 Back 键会销毁最上面的活动,下面的一个活动就会重新显示出来。
- 返回栈:
Android 是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈( Back Stack)。每当我们按下 Back 键或调用 finish()方法去销毁一个活动时,处于栈顶的活动会出栈, 这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。- onSaveInstanceState()方法:可将临时数据进行保存,解决活动被回收时临时数据得不到保存的问题。